Создание суперпользователя в пользовательской модели пользователя django с номером телефона в качестве имени пользователя

У меня есть проект django, в котором я хочу, чтобы в качестве поля имени пользователя был номер телефона. Я создал приложение с именем accounts, и это models.py:

class UserManager(BaseUserManager):
    use_in_migrations = True

    def create_user(self, phone_number, password, **extra_fields):
        user = self.model(phone_number=phone_number, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, phone_number, password, **extra_fields):
        extra_fields.setdefault("is_staff", True)
        extra_fields.setdefault("is_superuser", True)
        extra_fields.setdefault("is_active", 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(phone_number, password, **extra_fields)


class User(AbstractUser):
    phone_number = models.CharField(max_length=20, null=False, blank=False, unique=True)
    USERNAME_FIELD = "phone_number"
    username = None
    first_name = None
    last_name = None
    objects = UserManager()
    REQUIRED_FIELDS = [phone_number]

И я объявил ее как свою модель пользователя, в settings.py.

AUTH_USER_MODEL = "accounts.User"
ACCOUNT_USER_MODEL_USERNAME_FIELD = "phone_number"

Когда я запускаю python manage.py createsuperuser, я получаю эту ошибку:

django.core.exceptions.FieldDoesNotExist: User has no field named 'accounts.User.phone_number'

Я не могу понять, в чем проблема.

Это очень просто, мой друг, просто добавьте следующее в модель пользователя

USERNAME_FIELD = 'phone_number'

Посмотрите этот ответ, чтобы узнать больше: Вход в систему Django с помощью электронной почты или номера телефона

В моем коде было три проблемы:

  1. технически установка username поля в None должна быть сделана до объявления USERNAME_FIELD.
  2. REQUIRED_FIELDS итемы должны быть строками, а не переменными.
  3. phone_number не должно быть в REQUIRED_FIELDS, так как это USERNAME_FIELD.

Итак, мой класс модели пользователя будет выглядеть следующим образом:

class User(AbstractUser):
    username = None
    first_name = None
    last_name = None
    phone_number = models.CharField(max_length=20, null=False, blank=False, unique=True)
    email = models.EmailField(max_length=100, blank=True, null=True)
    name = models.CharField(max_length=50)
    USERNAME_FIELD = "phone_number"
    objects = UserManager()

Не нужно передавать поле USERNAME в settings.py вы можете передать явно USERNAME FIELD вот так...


class User(AbstractUser):
    phone_number = models.CharField(max_length=20, null=False, blank=False, unique=True)
    email = models.EmailField(max_length=100, blank=True, null=True)
    name = models.CharField(max_length=50)
    username = None
    first_name = None
    last_name = None
    
    objects = UserManager()

    
    USERNAME_FIELD = 'phone_number'
    REQUIRED_FIELDS = [email]

для лучшего понимания смотрите эту ссылку здесь

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