Ошибка при логине в админку после изменении UserManager

Решил впервые изменить вручную кастомную логику логина, раньше использовал библиотеку, вот код:

class CustomUserManager(UserManager):
    """
        Set email as required field in reg process such a username
    """

    use_in_migrations = True

    def _create_user(self, email, password, **extra_fields):
        if not email:
            raise ValueError('Email is required field')

        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)

        return user

    def create_user(self, email=None, password=None, **extra_fields):
        extra_fields.setdefault('is_staff', False)
        extra_fields.setdefault('is_superuser', False)
        return self._create_user(email, password, **extra_fields)

    def create_superuser(self, email=None, password=None, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)

        if extra_fields.get('is_staff') is not True:
            raise ValueError('Superuser must have is_staff=True.')
        if extra_fields.get('is_superuser') is not True:
            raise ValueError('Superuser must have is_superuser=True.')

        return self._create_user(email, password, **extra_fields)


class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(unique=True)

    is_active = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)
    is_staff = models.BooleanField(default=False)
    is_verif = models.BooleanField(default=False)

    date_joined = models.DateTimeField(default=timezone.now)

    objects = CustomUserManager()  # set our custom manager

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    class Meta:
        verbose_name = 'User'
        verbose_name_plural = 'Users'

    def get_full_name(self):
        return self.email

    def get_short_name(self):
        return self.email.split('@')[0]

По сути все стандартно, просто делаю все под почту, в настройках установлен

AUTH_USER_MODEL = 'users.User'

Создаю юзера через консоль докера образа моей бд, вот скрин что юзер создан введите сюда описание изображения

Так-же чтобы быть точно уверенным проверяю пароль: введите сюда описание изображения

но чтобы я не делал и как бы не писал пароль ошибка одна

Please enter the correct email and password for a staff account. Note that both fields may be case-sensitive.

Можете подсказать что не так?


Ответы (1 шт):

Автор решения: gajin

Нашел рабочее решение, но в чем именно проблема понять не смог) Подозреваю что ошибка могла быть в том, что в UserManager нужно наследовать BaseUserManager вместо UserManager, так-же следует убрать PermissionsMixin из наследования и в том-же классе наследоваться от AbstractUser вместо AbstractBaseUser, а так-же указать username = None. Пример кода ниже:

class UserManager(BaseUserManager):
    use_in_migrations = True

    def _create_user(self, email, password, **extra_fields):
        if not email:
            raise ValueError("The given email must be set")
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_user(self, email, password=None, **extra_fields):
        extra_fields.setdefault("is_staff", False)
        extra_fields.setdefault("is_superuser", False)
        return self._create_user(email, password, **extra_fields)

    def create_superuser(self, email, password, **extra_fields):
        extra_fields.setdefault("is_staff", True)
        extra_fields.setdefault("is_superuser", True)

        if extra_fields.get("is_staff") is not True:
            raise ValueError("Superuser must have is_staff=True.")
        if extra_fields.get("is_superuser") is not True:
            raise ValueError("Superuser must have is_superuser=True.")

        return self._create_user(email, password, **extra_fields)

class User(AbstractUser):
    """Updated user model"""
    username = None
    email = models.EmailField(_("email address"), unique=True)

    USERNAME_FIELD = "email"
    REQUIRED_FIELDS = []

    objects = UserManager()

    def get_full_name(self):
        return self.email.strip('@')[0]
→ Ссылка