我有一个与用户具有 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'所以我可以在注册后自动登录用户。)