Django注册表单'AnonymousUser'对象没有属性'后端' [英] Django Register Form 'AnonymousUser' object has no attribute 'backend'

查看:164
本文介绍了Django注册表单'AnonymousUser'对象没有属性'后端'的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下注册视图进入新的用户。
我希望它进入新用户,然后自动登录。
它通过用户记录保存,但在尝试登录时返回此错误:
'AnonymousUser'对象没有属性'后端'



视图。 py

  def register(request):
if request.method =='POST':
form = UserRegisterForm(request.POST,error_class = DivErrorList)
如果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,
})
/ pre>

forms.py

  class UserRegisterForm(forms.ModelForm )

class Meta:
model = User
fields =('用户名','first_name','last_name','email','密码')

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名称'
self.fields ['email']。label ='电子邮件地址'

def clean(self):
cleaning_data = self.cleaned_data
password1 = cleaning_data.get('password',None)
password2 = clean_data.get('password_compare',无)
如果没有(密码1):
error_msg = u'这个字段是必需的'
self._errors ['password'] = self.error_class([error_msg])
if没有(password2):
error_msg = u'这个字段是必需的'
self._errors ['password_compare'] = self.error_class([error_msg])
#密码字段必须匹配
如果password1!= password2:
error_msg = u'Password不匹配确认'
self._errors ['password'] = self.error_class([error_msg])
del cleaning_data ['password']
#不能有一个用户名已经存在
try:
existing_user = User.objects.get(username = clean_data.get('username'))
error_msg = u'Username已经存在'
self._errors ['username'] = self.error_class([error_msg])
del cleaning_data ['username']
return clean_data
除了User.DoesNotExist:
返回clean_data


解决方案

你的你ser将永远不会进行身份验证,因为您以纯文本形式保存密码 - authenticate 预期使用散列密码。在将新的用户对象保存到db之前,您应该调用 user.set_password(password) - 请参阅内置 UserCreationForm 。 / p>

I have the following register view that enters a new user. I want it to enter the new user and then log in automatically. It saves through the User record but returns this error when trying to login: 'AnonymousUser' object has no attribute '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

解决方案

Your user will never authenticate, because you're saving the password in plain text - and authenticate expects a hashed password. You should call user.set_password(password) on the newly-created user object before saving it to the db - see the built-in UserCreationForm.

这篇关于Django注册表单'AnonymousUser'对象没有属性'后端'的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆