Невозможно войти в панель администратора в Django с помощью пользовательской модели пользователя

Я создал пользовательскую модель пользователя, которая переопределяет стандартную AUTH_MODEL в settings.py. Я не могу войти в панель администратора, используя python manage.py createsuperuser. Сообщение, которое выдает мне администратор, выглядит следующим образом:

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

Ниже приведен мой код для models.py:

from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager
from django.db import models
from django.contrib.auth.hashers import make_password
from phonenumber_field.modelfields import PhoneNumberField


class UserAccountManager(BaseUserManager):
    def create_user(self, email, username, first_name, last_name, phone, password=None):
        if not email:
            return ValueError("User must have an email address!")
        if not username:
            return ValueError("User must have a username!")
        if not first_name:
            return ValueError("User must have a first name!")
        if not last_name:
            return ValueError("User must have a last name!")
        if not phone:
            return ValueError("User must have a phone number!")

        user = self.model(
            email=self.normalize_email(email),
            username=username,
            first_name=first_name,
            last_name=last_name,
            phone=phone,
        )
        hashed_password = make_password(password)
        user.set_password(hashed_password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, username, first_name, last_name, phone, password):
        user = self.create_user(
            email=self.normalize_email(email),
            username=username,
            first_name=first_name,
            last_name=last_name,
            phone=phone,
            password=password,
        )
        user.is_admin = True
        user.save(using=self._db)
        return user


class UserAccount(AbstractBaseUser):
    username = models.CharField(null=False, blank=False, max_length=30, unique=True)
    first_name = models.CharField(null=False, blank=False, max_length=50)
    last_name = models.CharField(null=False, blank=False, max_length=50)
    email = models.EmailField(null=False, blank=False, unique=True)
    date_joined = models.DateTimeField(auto_now_add=True)
    last_login = models.DateTimeField(auto_now=True)
    phone = PhoneNumberField(unique=True, null=False, blank=False, max_length=13)
    is_admin = models.BooleanField(default=False)

    USERNAME_FIELD = "username"
    REQUIRED_FIELDS = ['first_name', 'last_name', 'email', 'phone']

    objects = UserAccountManager()

    def __str__(self):
        return str(self.username)

    def has_perm(self, perm, obj=None):
        "Does the user have a specific permission?"
        # Simplest possible answer: Yes, always
        return self.is_admin

    def has_module_perms(self, app_label):
        "Does the user have permissions to view the app `app_label`?"
        # Simplest possible answer: Yes, always
        return True

    @property
    def is_staff(self):
        "Is the user a member of staff?"
        # Simplest possible answer: All admins are staff
        return self.is_admin

Методы, которые я пробовал:

  1. I have tried adding the def is_staff() to return that admin is a staff.
  2. I'm not sure if this has an effect, but I hashed the password using the make_password because without it, the passwords that are stored in the database are raw.

В этом разделе:

def create_superuser(self, email, username, first_name, last_name, phone, password):
    user = self.create_user(
        email=self.normalize_email(email),
        username=username,
        first_name=first_name,
        last_name=last_name,
        phone=phone,
        password=password,
    )
    user.is_admin = True
    user.save(using=self._db)
    return user

Добавьте is_staff=True и is_admin=True в:

user = self.create_user(
            email=self.normalize_email(email),
            username=username,
            first_name=first_name,
            last_name=last_name,
            phone=phone,
            password=password,
            is_staff=True,
            is_admin=True
        )
Вернуться на верх