(Django Allauth) Объект 'CustomUser' не имеет атрибута 'username'

Я пытаюсь реализовать модель CustomUser в Django Allauth. Когда я использовал предоставленный allauth шаблон входа, я столкнулся с этой ошибкой

enter image description here

Моя модель пользователя клиента в

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

После поиска вышеуказанной ошибки, я попробовал следующее:

  1. Make sure AUTH_USER_MODEL is set in settings.py
""" custom user """
AUTH_USER_MODEL = 'users.CustomUser'
  1. Changing AbtractBaseUser to AbstractUser in models.py

Это приводит к другой ошибке: enter image description here

  1. 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. enter image description here

  2. 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

Вернуться на верх