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