(Django Allauth) Объект 'CustomUser' не имеет атрибута 'username'
Я пытаюсь реализовать модель CustomUser в Django Allauth. Когда я использовал предоставленный allauth шаблон входа, я столкнулся с этой ошибкой
Моя модель пользователя клиента в
users/models.py
from django.db import models
from django.utils import timezone
from django.utils.translation import gettext_lazy as _
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager
class CustomUserManager(BaseUserManager):
def create_superuser(self, email, password=None):
if password is None:
raise TypeError('Password should not be none')
user = self.create_user(email, password)
user.is_superuser = True
user.is_staff = True
if user.is_superuser is not True:
raise ValueError(
'Superuser must be assigned to is_staff=True.')
if user.is_staff is not True:
raise ValueError(
'Superuser must be assigned to is_superuser=True.')
user.save()
return user
def create_user(self, email, password=None):
if email is None:
raise TypeError('Users should have a Email')
email = self.normalize_email(email)
user = self.model(email=email)
user.set_password(password)
user.save()
return user
AUTH_PROVIDERS = {'facebook': 'facebook', 'google': 'google',
'twitter': 'twitter', 'email': 'email'}
class CustomUser(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(max_length=255, unique=True, db_index=True)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
about = models.TextField(_(
'about'), max_length=500, blank=True)
auth_provider = models.CharField(
max_length=255, blank=False,
null=False, default=AUTH_PROVIDERS.get('email'))
USERNAME_FIELD = 'email'
objects = CustomUserManager()
def __str__(self):
return self.email
settings.py
""" custom user """
AUTH_USER_MODEL = 'users.CustomUser'
""" allauth """
AUTHENTICATION_BACKENDS = [
# Needed to login by username in Django admin, regardless of `allauth`
'django.contrib.auth.backends.ModelBackend',
# `allauth` specific authentication methods, such as login by e-mail
'allauth.account.auth_backends.AuthenticationBackend',
]
SITE_ID = 1
# Provider specific settings
SOCIALACCOUNT_PROVIDERS = {
}
ACCOUNT_SIGNUP_PASSWORD_ENTER_TWICE = False
ACCOUNT_USERNAME_REQUIRED = False # This removes the username field
ACCOUNT_AUTHENTICATION_METHOD = 'email'
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_UNIQUE_EMAIL = True
После поиска вышеуказанной ошибки, я попробовал следующее:
- Make sure AUTH_USER_MODEL is set in settings.py
""" custom user """
AUTH_USER_MODEL = 'users.CustomUser'
- Changing AbtractBaseUser to AbstractUser in models.py
Add username field in CustomUser: Another issue popped up which I tried to fix but in the end had to delete the migrations folder and redo.

Check logged_in.txt and trace the user variable: I found that
user = get_user_model(), which is defined as follows:
def get_user_model():
"""
Return the User model that is active in this project.
"""
try:
return django_apps.get_model(settings.AUTH_USER_MODEL, require_ready=False)
except ValueError:
raise ImproperlyConfigured("AUTH_USER_MODEL must be of the form 'app_label.model_name'")
except LookupError:
raise ImproperlyConfigured(
"AUTH_USER_MODEL refers to model '%s' that has not been installed" % settings.AUTH_USER_MODEL
)
Это странно, поскольку я уже определил AUTH_USER_MODEL = users.CustomUser выше.
Я совсем запутался в этом вопросе. Не могли бы вы показать мне способ решения этой проблемы?
Спасибо!
Я тоже попотела над этим, но нашла в документации следующее, что решило мою проблему:
Пользовательские модели
Если вы используете пользовательскую модель пользователя, вам необходимо указать, какое поле представляет имя пользователя, если таковое имеется. Здесь имя пользователя действительно относится к поле, представляющее псевдоним, который пользователь использует для входа в систему, а не к какому-то уникальному идентификатору (возможно, включающему адрес электронной почты), как в случае с в случае с Django's AbstractBaseUser.USERNAME_FIELD.
.Поэтому, если ваша пользовательская модель пользователя не имеет поля имени пользователя (опять же, не путать с адресом электронной почты или идентификатором пользователя), вам необходимо установить ACCOUNT_USER_MODEL_USERNAME_FIELD в None. Это отключит функциональность, связанную с именем пользователя, в allauth. Помните, что также установить ACCOUNT_USERNAME_REQUIRED в False.
https://django-allauth.readthedocs.io/en/latest/advanced.html#custom-user-models

