Объект регистра Django 'AnonymousUser' не имеет атрибута 'backend' - PullRequest
4 голосов
/ 14 октября 2011

У меня есть следующее представление регистра, которое вводит нового пользователя. Я хочу, чтобы он ввел нового пользователя, а затем авторизовался автоматически. Он сохраняет запись пользователя, но возвращает эту ошибку при попытке входа в систему: Объект '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 голосов
/ 14 октября 2011

Ваш пользователь никогда не будет проходить аутентификацию, потому что вы сохраняете пароль в виде обычного текста - и authenticate ожидает хешированный пароль. Вы должны вызвать user.set_password(password) для вновь созданного пользовательского объекта перед сохранением его в БД - см. Встроенный UserCreationForm.

0 голосов
/ 13 ноября 2011

У меня была такая же ошибка для недавно зарегистрированного пользователя, и это оставило меня разочарованным в течение часа.

Был фрагмент кода, который пытался зарегистрировать пользователя сразу после регистрации.
Обычно это работало просто отлично, но не в этот раз.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...