Объект формы регистрации Django 'AnonymousUser' не имеет атрибута 'backend'
У меня есть следующий вид регистрации, который вводит нового пользователя. Я хочу, чтобы он ввел нового пользователя, а затем авторизовался автоматически. Сохраняет запись пользователя, но возвращает эту ошибку при попытке входа в систему: объект 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 ответа
Ваш пользователь никогда не будет проходить аутентификацию, потому что вы сохраняете пароль в виде обычного текста - и authenticate
ожидает хешированный пароль. Вам следует позвонить user.set_password(password)
на вновь созданном пользовательском объекте перед сохранением его в БД - см. встроенныйUserCreationForm
,
У меня была та же ошибка для недавно зарегистрированного пользователя, и она на час расстроилась.
Был фрагмент кода, который пытался войти в систему сразу после регистрации.
Обычно это работало просто отлично, но не в этот раз.
def attempt_login(self, email, password):
user = authenticate(username=email, password=password)
login(self.request, user)
return user
Казалось что authenticate
возвращенный None
, а затем позвонив login
с None
вызвал это исключение. Но я был уверен, что User
был создан после регистрации.
Наконец, я понял, что логин этого конкретного пользователя длиннее 30 символов, а поле формы не имеет проверки. Логин будет усечен в базе данных, и, следовательно, authenticate
был вызван для несуществующего входа в систему.