Создание суперпользователя в пользовательской модели пользователя 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 с помощью электронной почты или номера телефона
В моем коде было три проблемы:
- технически установка
username
поля вNone
должна быть сделана до объявленияUSERNAME_FIELD
. REQUIRED_FIELDS
итемы должны быть строками, а не переменными.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]
для лучшего понимания смотрите эту ссылку здесь