扩展UserCreationForm以包括电子邮件、名字和姓氏

4
我已经陷入了困境,一直无法弄清楚发生了什么。我刚开始学习Django,并设置了登录,现在想实现注册页面。
我开始使用UserCreationForm表单并且也能正常工作,但是我想添加电子邮件、名字和姓氏等字段。我认为可以通过继承UserCreationForm并添加这些字段来解决问题,但似乎不起作用。我也尝试重写save方法,但也不行。
我的自定义表单如下所示:
class RegistrationForm(UserCreationForm):
    first_name = forms.CharField(max_length=30)
    last_name = forms.CharField(max_length=30)
    email = forms.EmailField(max_length=75)

    class Meta:
        model = User
        fields = ("first_name", "last_name", "email",)

    def save(self, commit=True):
        user = super(RegistrationForm, self).save(commit=False)
        user.first_name = self.cleaned_data["first_name"]
        user.last_name = self.cleaned_data["last_name"]
        user.email = self.cleaned_data["email"]
        if commit:
            user.save()
        return user

处理这个问题的视图如下所示:
def Register(request):
    if request.method == 'POST':
        form = RegistrationForm(request.POST)
        if form.is_valid():
            new_user = form.save();
            new_user = authenticate(username=request.POST['username'], password=request.POST['password1'])
            login(request, new_user)
            return HttpResponseRedirect('/members/home')
    else:
        form = RegistrationForm()

    return render_to_response('register.html', {'form' : form}, context_instance=RequestContext(request))

表单加载新字段后一切正常,但是当我提交时出现错误:
AttributeError at /register/

'AnonymousUser' object has no attribute 'backend'

噢,而且我正在使用Django 1.3。

你有什么想法我做错了什么?


我应该提到的另一件事是,似乎记录已经成功地输入到数据库中,只是用户名字段为空... 名字,姓氏,电子邮件和密码都有值。 - bb89
1个回答

3
我猜测您的元类fields没有包括username。您正在从UserCreationForm继承表单字段,但它没有保存到User模型,因此authenticate失败并在login()上崩溃。
文档建议,在使用login()之前检查authenticate()是否成功。

成功了!谢谢!但我不完全确定我理解了。为什么我必须指定用户名字段而不是密码字段? - bb89
因为密码是通过 user.set_password 设置的,而不是一些 ModelForm 特定的逻辑。 - Yuji 'Tomita' Tomita
哦,好的,那很有道理。再次感谢,我非常感激。 - bb89

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接