Django注册表单:'AnonymousUser'对象没有'backend'属性。

4

我有以下注册页面,可以输入新用户。

我想让它自动输入新用户并登录。

它通过User记录进行保存,但在尝试登录时返回以下错误:

'AnonymousUser'对象没有属性'backend'

views.py

def register(request):
    if request.method == 'POST':
        form = UserRegisterForm(request.POST, error_class=DivErrorList)
        if form.is_valid():
            form.save()
            new_user = authenticate(username=request.POST['username'],password=request.POST['password'])
            login(request, new_user)
            return HttpResponseRedirect('/production/')
    else:
        form = UserRegisterForm(error_class=DivErrorList)

    return render(request,'register.html', {
        'form': form,
    })

forms.py

class UserRegisterForm(forms.ModelForm):

    class Meta:
        model = User
        fields = ('username','first_name','last_name','email','password')

    password_compare = forms.CharField(max_length=128)

    def __init__(self, *args, **kwargs):
        super(UserRegisterForm, self).__init__(*args, **kwargs)
        self.fields['password_compare'].label = 'Password Again'
        self.fields['password'].help_text = ''
        self.fields['first_name'].label = 'First Name'
        self.fields['last_name'].label = 'Last Name'
        self.fields['email'].label = 'E-mail Address'

    def clean(self):
        cleaned_data = self.cleaned_data
        password1 = cleaned_data.get('password', None)
        password2 = cleaned_data.get('password_compare', None)
        if not (password1):
            error_msg = u'This field is required.'
            self._errors['password'] = self.error_class([error_msg])
        if not (password2):
            error_msg = u'This field is required.'
            self._errors['password_compare'] = self.error_class([error_msg])
        # password fields must match
        if password1 != password2:
            error_msg = u'Password doesn\'t match the confirmation.'
            self._errors['password'] = self.error_class([error_msg])
            del cleaned_data['password']
        # cannot have a username already existing
        try:
            existing_user = User.objects.get(username=cleaned_data.get('username'))
            error_msg = u'Username already exists.'
            self._errors['username'] = self.error_class([error_msg])
            del cleaned_data['username']
            return cleaned_data
        except User.DoesNotExist:
            return cleaned_data
2个回答

6

您的用户将永远无法进行身份验证,因为您正在以明文保存密码 - 而authenticate期望的是哈希密码。在将新创建的用户对象保存到数据库之前,您应该调用user.set_password(password) - 请参阅内置的UserCreationForm


非常感谢。查看内置的UserCreationForm让我找对了方向。 - dbcole
User(attr...) 会将密码以明文形式保存,而 User.objects.create_user(attr...) 则会为您哈希密码。 - innhyu

0
我在一个新注册用户中遇到了同样的错误,这让我沮丧了一个小时。
有一段代码尝试在注册后立即登录用户。 通常情况下它都能正常运行,但这一次没有。
def attempt_login(self, email, password):
    user = authenticate(username=email, password=password)
    login(self.request, user)

    return user 

看起来 authenticate 返回了 None,然后使用 None 调用 login 导致了这个异常。但我确定该 User 已在注册后创建。

最终,我意识到这个特定用户的登录名超过了30个字符,而表单字段没有进行验证。登录名会在数据库中get truncated,因此调用不存在的登录名时会调用 authenticate


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