При создании веб-приложения с Django часто возникает необходимость расширить встроенную модель пользователя дополнительными полями или методами. Это общее требование для многих веб-приложений, и, к счастью, Django предоставляет простой и гибкий способ добиться этого.

В этой статье мы рассмотрим, как расширить модель пользователя в Django, используя пользовательскую модель, которая расширяет классы AbstractBaseUser или AbstractUser. Мы также приведем несколько примеров, иллюстрирующих процесс.

Модель пользователя по умолчанию в Django

Прежде чем мы углубимся в расширение модели User, важно понять, что предоставляет модель User по умолчанию в Django. Модель User по умолчанию предоставляет базовые поля, такие как username, password, email, first_name и last_name. Этих полей часто бывает достаточно для многих веб-приложений.

Однако в некоторых случаях может потребоваться добавить в модель User дополнительные поля для хранения дополнительной информации о пользователе. Например, вы можете захотеть сохранить адрес пользователя, номер телефона или дату рождения.

Расширение пользовательской модели с помощью AbstractBaseUser

Django предоставляет два базовых класса, которые вы можете использовать для расширения модели пользователя: AbstractBaseUser и AbstractUser. AbstractBaseUser является более низкоуровневым из двух и требует, чтобы вы сами определили все необходимые поля и методы.

Вот пример того, как вы можете расширить модель пользователя с помощью AbstractBaseUser:

from django.contrib.auth.models import AbstractBaseUser, BaseUserManager


class MyUserManager(BaseUserManager):
    def create_user(self, email, 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.save(using=self._db)
        return user
    def create_superuser(self, email, password):
        user = self.create_user(
            email=email,
            password=password,
        )
        
        user.is_admin = True
        user.save(using=self._db)
        return user


class MyUser(AbstractBaseUser):
    email = models.EmailField(unique=True)
    first_name = models.CharField(max_length=30, blank=True)
    last_name = models.CharField(max_length=30, blank=True)
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)
    objects = MyUserManager()
    USERNAME_FIELD = 'email'
    def __str__(self):
        return self.email
    def has_perm(self, perm, obj=None):
        return True
    def has_module_perms(self, app_label):
        return True
    @property
    def is_staff(self):
        return self.is_admin

В этом примере мы определяем пользовательский менеджер для нашей модели пользователя, MyUserManager, который определяет методы create_user и create_superuser для создания пользователей и суперпользователей соответственно. Мы также определяем нашу пользовательскую модель пользователя, MyUser, которая расширяет AbstractBaseUser.

Модель MyUser определяет поля email, first_name, last_name, is_active и is_admin. Он также определяет атрибут objects, который указывает пользовательский менеджер для модели. Наконец, мы определяем несколько методов, необходимых для AbstractBaseUser, таких как __str__, has_perm, has_module_perms и is_staff.

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

Расширение пользовательской модели с помощью AbstractUser

Хотя AbstractBaseUser обеспечивает более низкоуровневый способ расширения модели User, он может быть довольно многословным и требовать большого количества шаблонного кода. AbstractUser, с другой стороны, предоставляет способ более высокого уровня для расширения модели пользователя путем построения поверх модели пользователя по умолчанию.

Вот пример того, как вы можете расширить модель пользователя с помощью AbstractUser:

from django.contrib.auth.models import AbstractUser


class MyUser(AbstractUser):
    phone_number = models.CharField(max_length=20, blank=True)
    date_of_birth = models.DateField(null=True, blank=True)

В этом примере мы определяем пользовательскую модель пользователя MyUser, которая расширяет AbstractUser. Добавим в модель два поля, phone_number и date_of_birth, в которых будет храниться номер телефона пользователя и дата рождения соответственно.

Использование пользовательской модели пользователя в вашем проекте Django

После того, как вы определили свою пользовательскую модель пользователя, вам нужно указать Django использовать ее вместо модели пользователя по умолчанию. Для этого вам нужно указать параметр AUTH_USER_MODEL в файле настроек вашего проекта Django:

AUTH_USER_MODEL = 'myapp.MyUser'

В этом примере myapp — это имя вашего приложения Django, а MyUser — это имя вашей пользовательской модели пользователя.

Заключение

В этой статье мы рассмотрели, как расширить модель пользователя в Django, используя пользовательскую модель, которая расширяет либо AbstractBaseUser, либо AbstractUser. Мы также предоставили примеры для иллюстрации процесса и показали, как использовать пользовательскую модель пользователя в вашем проекте Django.

Расширение модели User может быть мощным способом добавления дополнительных функций и информации пользователям вашего веб-приложения. Благодаря гибкости и простоте, которые предоставляет Django, легко создать пользовательскую модель пользователя, соответствующую вашим конкретным потребностям.

🎉 Спасибо за прочтение

Привет! Надеюсь, эта статья оказалась для вас информативной и полезной. Если у вас есть какие-либо вопросы или комментарии, свяжитесь со мной по электронной почте ([email protected]). Я всегда стремлюсь связаться с читателями и помочь им с любыми техническими проблемами, с которыми они могут столкнуться.

👨‍💻 Давайте общаться в социальных сетях

Не забудьте подписаться на меня на Medium, если вам интересно читать об стеках веб-разработки, больших данных и открытом исходном коде.

Найдите меня в Интернете: GitHubLinkedInTwitterFacebookInstagram

🤝 Делитесь знаниями

Если вы нашли эту статью полезной, поделитесь ею с друзьями и коллегами, которым она может быть полезна. Делиться — значит заботиться, и это помогает распространять знания и идеи среди тех, кто в них больше всего нуждается.