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