При создании веб-приложения с 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, если вам интересно читать об стеках веб-разработки, больших данных и открытом исходном коде.
Найдите меня в Интернете: GitHub • LinkedIn • Twitter • Facebook • Instagram
🤝 Делитесь знаниями
Если вы нашли эту статью полезной, поделитесь ею с друзьями и коллегами, которым она может быть полезна. Делиться — значит заботиться, и это помогает распространять знания и идеи среди тех, кто в них больше всего нуждается.