0

我有一个与用户具有 OneToOne 关系的客户端模型,以扩展用户模型。我需要能够注册用户(使用包含用户和客户端字段的表单),为此我使用了 django-registration。这是注册的视图,基于我发现的一些片段:

def register_client(request):
    if request.method == 'POST':
        userform = UserForm(request.POST, prefix='user')
        clientform = ClientForm(request.POST, prefix='client')
        if userform.is_valid() and clientform.is_valid():
            user = userform.save()
            client = clientform.save(commit=False)
            client.user = user
            client.save()
            login(request, user)
            return HttpResponseRedirect('/webapp/')
        else:
            return HttpResponse('error!')

    else:
        userform = UserForm(prefix='user')
        clientform = ClientForm(prefix='client')

    t = loader.get_template('register.html')
    c = RequestContext(request, {
        'userform':userform,
        'clientform':clientform,
    })
    return HttpResponse(t.render(c)) 

这是我的表格:

from registration.forms import RegistrationForm

class UserForm(RegistrationForm):   
    def save(self):
        new_user = User.objects.create_user(
            username=self.cleaned_data['username'],
            email = self.cleaned_data['email'],
            password=self.cleaned_data['password1'])
        new_user.backend='django.contrib.auth.backends.ModelBackend'
        new_user.save()
        return new_user

class ClientForm(forms.ModelForm):
    class Meta:
        model = Client
        exclude = ['user']

我为 UserForm 实现了 save() 方法,因为 RegistrationForm 不像任何典型的表单那样实现。

为什么一个人必须费尽心思来实现一些后端才能保存一个表单?这种简单的方法有什么问题吗?它确实有效。

(我还添加了,new_user.backend='django.contrib.auth.backends.ModelBackend'所以我可以在注册后自动登录用户。)

4

2 回答 2

0

我不知道如何回答你的问题。如果您的代码有效,那么我认为没有问题。但是正如 zaphod 所说,django-registration 会为您保存和激活用户。如果您想向用户添加额外的数据,那么也可以使用 zaphod 建议的 django-profiles。

我自己使用django-userena。它就像 django-registration 和 django-profiles 合二为一。

于 2012-06-26T11:23:28.340 回答
0

为什么需要保存 User 模型?django-registration 会为你做这件事,除非你需要一些不同的功能。如果您想为每个用户存储一些额外的信息,最好使用User profiles

于 2012-06-25T18:22:47.310 回答