У объекта AnonymousUser в Django нет атрибута _meta

Я использую социальный логин в моем приложении Django. Итак, я добавил дополнительные бэкэнды в мой файл settings.py.

AUTHENTICATION_BACKENDS = [
    'django.contrib.auth.backends.ModelBackend',
    'social_core.backends.open_id.OpenIdAuth',
    'social_core.backends.google.GoogleOpenId',
    'social_core.backends.google.GoogleOAuth2',
    'social_core.backends.google.GoogleOAuth',
    'social_core.backends.twitter.TwitterOAuth',
    'social_core.backends.facebook.FacebookOAuth2',
    'social_core.backends.github.GithubOAuth2',

]

Я также использовал UserCreationForm для регистрации,

class SignupForm(UserCreationForm):
    first_name = forms.CharField(max_length=30, required=True, help_text='Required.')
    last_name = forms.CharField(max_length=30, required=True, help_text='Required.')
    email = forms.EmailField(max_length=254, help_text='Required. Inform a valid email address.')

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

Это файл просмотров,

def signup(request):
    if request.method == 'POST':
        form  = SignupForm(request.POST)
        if form.is_valid():
            form.save()
            username = form.cleaned_data.get('username')
            raw_pass = form.cleaned_data.get('password')
            user = authenticate(request, username=username, password=raw_pass)
            login(request,user,backend='django.contrib.auth.backends.ModelBackend')
            url = reverse('location:get_location')
            print("location_url ", url)
            return HttpResponseRedirect(url)
    else:
        form = SignupForm()
    return render(request, 'signup.html', {'form':form})

Теперь я получаю эту ошибку, когда я нажимаю кнопку регистрации в моей форме,

'AnonymousUser' object has no attribute '_meta'

на линии,

login(request,user,backend='django.contrib.auth.backends.ModelBackend')

Почему так?

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

Что вызывает эту ошибку? и как это решить?

РЕДАКТИРОВАТЬ -

Internal Server Error: /signup/
Traceback (most recent call last):
  File "/home/luvpreet/Envs/weather/local/lib/python2.7/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = get_response(request)
  File "/home/luvpreet/Envs/weather/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
   File "/home/luvpreet/Envs/weather/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/luvpreet/Desktop/drf-vogo/weather/weather/pilot/views.py", line 45, in signup
    login(request,user,backend='django.contrib.auth.backends.ModelBackend')
  File "/home/luvpreet/Envs/weather/local/lib/python2.7/site-packages/django/contrib/auth/__init__.py", line 154, in login
     request.session[SESSION_KEY] = user._meta.pk.value_to_string(user)
  File "/home/luvpreet/Envs/weather/local/lib/python2.7/site-packages/django/utils/functional.py", line 239, in inner
    return func(self._wrapped, *args)
AttributeError: 'AnonymousUser' object has no attribute '_meta'

Ответ 1

У вас уже есть пользователь, когда вы сохраняете форму, поэтому вам не нужно вызывать authenticate, поскольку вы уже предоставляете бэкэнд при вызове login():

user = form.save()
login(request, user, backend='django.contrib.auth.backends.ModelBackend')

Ответ 2

Пришел сюда для поиска этой ошибки. Наш стек - django-oscar + wagtail. Оказывается, мы удалили oscar.apps.customer.auth_backends.EmailBackend из нашего AUTHENTICATION_BACKENDS. Вернувшись, проблема решена.

Ответ 3

UserCreationForm() обеспечивает как поля пароля, так и поля password_confirmation. В этом случае аутентификация завершается неудачно, потому что вы пытаетесь получить "пароль", который не существует, поэтому вы возвращаете пользователя как None. Если вы напечатаете form.cleaned_data, вы получите словарь, похожий на этот

{'username': 'myuser', 'password1': 'pass1234', 'password2': 'pass1234'}

Изменение строки raw_pass должно решить проблему:

raw_pass = form.cleaned_data.get('password1')

Ответ 4

Причина возврата Нет При входе в систему с созданным пользователем из регистрационной формы, в БД он проверяет конкретного пользователя с зашифрованным паролем, но мы сохраняем пароль в тексте, поэтому, если вы дадите даже правильное имя пользователя и пароль, произойдет сбой

Добавьте ниже бэкенды модели в файл setting.py

AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.ModelBackend',)

 или передайте backend самой функции входа в систему

login(request, username,password, backend='django.contrib.auth.backends.ModelBackend')

импортировать функцию make_password и передать ей пароль, который идет из регистрационной формы, после чего он сохранит пароль в БД в зашифрованном виде

from django.contrib.auth.hashers import make_password

raw_pass = form.cleaned_data.get('password') raw_pass = make_password(form.cleaned_data.get('password'))

Джанго = 2.2.4

Ответ 5

Я верю, потому что вы не хэшировали пароль. это сработало для меня. попробуйте:

        user = userform.save()
        user.set_password(user.password)
        user.save()