Объект формы регистрации 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 был вызван для несуществующего входа в систему.

Другие вопросы по тегам