Looking for django Keywords? Try Ask4Keywords

Django Спецификация пользовательской модели пользователя


пример

Встроенная User модель Django не всегда подходит для некоторых проектов. На некоторых сайтах может быть больше смысла использовать адрес электронной почты вместо имени пользователя.

Вы можете переопределить модель User по умолчанию, добавив вашу User модель User в параметр AUTH_USER_MODEL в файле настроек проектов:

AUTH_USER_MODEL = 'myapp.MyUser'

Обратите внимание, что настоятельно AUTH_USER_MODEL создать AUTH_USER_MODEL прежде чем создавать какие-либо миграции или запускать manage.py migrate в первый раз. Из-за ограничений функции динамической зависимости Django.

Например, в вашем блоге вы можете захотеть, чтобы другие авторы имели возможность входа в систему с адресом электронной почты вместо обычного имени пользователя, поэтому мы создаем User модель User с адресом электронной почты как USERNAME_FIELD :

from django.contrib.auth.models import AbstractBaseUser

class CustomUser(AbstractBaseUser):
     email = models.EmailField(unique=True)
     
     USERNAME_FIELD = 'email'

Наследуя AbstractBaseUser мы можем построить совместимую модель User . AbstractBaseUser обеспечивает основную реализацию модели User .

Чтобы команда Django manage.py createsuperuser знала, какие другие поля необходимы, мы можем указать REQUIRED_FIELDS . Это значение не влияет на другие части Django!

class CustomUser(AbstractBaseUser):
    ...
    first_name = models.CharField(max_length=254)
    last_name = models.CharField(max_length=254)
    ...
    REQUIRED_FIELDS = ['first_name', 'last_name']

Чтобы быть совместимым с другой частью Django, нам все равно нужно указать значение is_active , функции get_full_name() и get_short_name() :

class CustomUser(AbstractBaseUser):
    ...
    is_active = models.BooleanField(default=False)
    ...
    def get_full_name(self):
        full_name = "{0} {1}".format(self.first_name, self.last_name)
        return full_name.strip()

    def get_short_name(self):
        return self.first_name

Вы также должны создать пользовательский UserManager для своей модели User , который позволяет Django использовать функции create_user() и create_superuser() :

from django.contrib.auth.models import BaseUserManager

class CustomUserManager(BaseUserManager):
    def create_user(self, email, first_name, last_name, password=None):
        if not email:
            raise ValueError('Users must have an email address')

        user = self.model(
            email=self.normalize_email(email),
        )

        user.set_password(password)
        user.first_name = first_name
        user.last_name = last_name
        user.save(using=self._db)
        return user

    def create_superuser(self, email, first_name, last_name, password):
        user = self.create_user(
            email=email,
            first_name=first_name,
            last_name=last_name,
            password=password,
        )

        user.is_admin = True
        user.is_active = True
        user.save(using=self.db)
        return user