Как расширить модель пользователя Django
Если вы работаете с Django и создаете что–либо, связанное с учетными записями пользователей – например, блог, магазин или сайт для подписки, - вы, скорее всего, столкнетесь с тем, что модели пользователя по умолчанию просто недостаточно.
Возможно, вы хотите добавить фотографию профиля, номер телефона или дополнительные разрешения.
Дело в том, что расширение пользовательской модели Django поначалу может показаться запутанным. Это звучит технически, и Интернет полон советов, которые либо пропускают важные детали, либо становятся слишком сложными.
Я тоже там был.
Итак, в этом руководстве я расскажу вам, как правильно, шаг за шагом, расширить пользовательскую модель Django, не добавляя ненужной нагрузки в ваш проект.
Я покажу вам, какой метод использовать, когда его использовать и как избежать распространенных ошибок, которые могут вызвать проблемы позже.
Давайте разберем все это по порядку.
Что такое Пользовательская Модель в Django?
Django, популярный веб-фреймворк на Python, поставляется со встроенной пользовательской моделью, которая обрабатывает аутентификацию и авторизацию.
Пользовательская модель по сути, представляет собой таблицу базы данных и соответствующий класс Python, который хранит основную информацию о пользователях вашего приложения, такую как имена пользователей, пароли, адреса электронной почты и другие важные детали.
Поскольку для многих проектов требуются дополнительные пользовательские данные или поведение, расширение или обновление пользовательской модели может быть очень полезным.
Во многих приложениях может потребоваться добавить дополнительные поля для получения дополнительной информации о пользователях. Например, вам может потребоваться добавить:
-
Фотография профиля для отображения аватара каждого пользователя.
-
Номер телефона для связи или многофакторной аутентификации.
-
Биография или краткое описание
-
Дополнительные разрешения или атрибуты, которые не указаны в полях Django по умолчанию, позволяют вашему приложению более эффективно контролировать доступ или персонализировать содержимое.
Возможно, вам также захочется отслеживать предпочтения и роли пользователей. Или, возможно, вы используете электронную почту в качестве имени пользователя и хотите настроить поведение при входе в систему.
Эти изменения важны, поскольку они выходят за рамки возможностей встроенной пользовательской модели Django по умолчанию. И попытка втиснуть эту дополнительную информацию во встроенную пользовательскую модель, не выполнив ее должным образом, может привести к ошибкам или нарушению процесса миграции базы данных. К счастью, Django предлагает нам несколько простых способов сделать это.
Расширяя модель, вы гарантируете, что все компоненты вашей системы – формы, представления, серверные части проверки подлинности и административные интерфейсы – будут иметь дополнительные данные, необходимые для правильного управления пользователями.
Без такой настройки вы можете столкнуться с ограничениями при попытке реализовать функции, требующие дополнительной информации о пользователе.
Предварительные условия
Прежде чем приступить к расширению пользовательской модели Django, у вас должно быть:
-
Базовые знания Django: Знакомство со структурой проекта, моделями, представлениями и шаблонами Django.
-
Понимание Python: Поскольку Django является платформой Python, необходимы практические знания Python.
-
Опыт работы с пользовательской моделью Django по умолчанию: Знание того, как Django обрабатывает аутентификацию и пользовательские сеансы, обеспечивает прочную основу для настройки пользовательской модели.
-
Среда разработки: Убедитесь, что у вас установлена рабочая программа Django, редактор кода и настроена соответствующая база данных (например, SQLite для разработки).
Я возьму на себя выполнение этих предварительных условий, если вам удобно создавать и запускать проекты на Django.
Ознакомившись с этими основными принципами, вы будете лучше подготовлены к эффективному расширению пользовательской модели, независимо от того, добавляете ли вы дополнительные поля для фотографий профиля, номеров телефонов или дополнительных разрешений.
Три способа расширить пользовательскую модель
Существует три основных подхода к расширению пользовательской модели в Django:
1. Создайте модель профиля пользователя (связь "один к одному")
Это самый простой и безопасный вариант, если в вашем проекте уже используется пользовательская модель Django по умолчанию и вы не хотите ее менять.
Вы создаете новую модель, которая ссылается на пользователя с помощью поля "один к одному". Затем вы сохраняете всю дополнительную информацию в этой модели профиля.
Пример:
from django.contrib.auth.models import User
from django.db import models
class UserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
phone_number = models.CharField(max_length=15)
profile_picture = models.ImageField(upload_to='profile_pics', null=True, blank=True)
Вы можете автоматически подключить профиль, используя сигналы Django:
from django.db.models.signals import post_save
from django.dispatch import receiver
@receiver(post_save, sender=User)
def create_or_update_user_profile(sender, instance, created, **kwargs):
if created:
UserProfile.objects.create(user=instance)
else:
instance.userprofile.save()
Этот подход лучше всего подходит для уже запущенных проектов или для тех, где вы хотите упростить работу.
2. Расширить AbstractUser
Это лучший вариант, если вы начинаете новый проект и хотите полностью контролировать пользовательскую модель. Вы создаете свою пользовательскую модель пользователя, создавая подклассы AbstractUser.
Это позволяет добавлять дополнительные поля непосредственно в пользовательскую модель без изменения основного режима аутентификации.
Пример:
from django.contrib.auth.models import AbstractUser
from django.db import models
class CustomUser(AbstractUser):
phone_number = models.CharField(max_length=15, blank=True)
profile_picture = models.ImageField(upload_to='profile_pics', null=True, blank=True)
Затем в ваших настройках:
AUTH_USER_MODEL = 'yourapp.CustomUser'
Перед первым переносом необходимо установить значение AUTH_USER_MODEL. Не пропускайте этот шаг, иначе позже вы столкнетесь с ошибками переноса.
Этот подход лучше всего подходит для новых проектов, где требуется полная гибкость.
3. Расширить AbstractBaseUser
Это самый продвинутый вариант. Вы создаете свою пользовательскую модель с нуля, даже контролируя, как работает аутентификация. Это здорово, если вам нужно использовать электронную почту вместо имени пользователя или вы хотите полностью настроить процесс входа в систему.
Но позвольте мне быть честным: это еще и дополнительная работа. Вам нужно будет настроить свой собственный менеджер и обрабатывать разрешения вручную.
Этот подход лучше всего подходит для проектов со сложными требованиями к пользователям или пользовательскими процедурами входа в систему.
Какой Метод Вы должны использовать?
Если у вас уже есть работающий проект и вам просто нужно добавить несколько дополнительных полей, придерживайтесь модели профиля пользователя.
Если вы начинаете с нуля и хотите добавить пользовательские поля с самого начала, выберите AbstractUser.
Используйте AbstractBaseUser только в том случае, если вам нужен полный контроль.
Типичные ошибки, которых следует избегать
-
Изменение
AUTH_USER_MODELпосле выполнения миграции (это нарушает работу вашей базы данных) -
Забыли установить
AUTH_USER_MODELвsettings.py -
Не обновляется admin.py при использовании пользовательской модели пользователя (подробнее об этом в следующем разделе)
-
Не создается
CustomUserManagerпри использованииAbstractBaseUser
Как заставить это работать с Django Admin
Если вы используете AbstractUser, вам нужно будет обновить панель администратора, чтобы распознать вашу пользовательскую модель пользователя.
Вот краткий пример:
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import CustomUser
class CustomUserAdmin(UserAdmin):
model = CustomUser
fieldsets = UserAdmin.fieldsets + (
(None, {'fields': ('phone_number', 'profile_picture')}),
)
admin.site.register(CustomUser, CustomUserAdmin)
Таким образом, вы по-прежнему получите все функции администратора по умолчанию, но с добавлением пользовательских полей.
Часто задаваемые вопросы
Нужно ли мне использовать AbstractBaseUser, чтобы использовать электронную почту в качестве имени пользователя?
Не всегда. Вы можете использовать AbstractUser и просто скрыть поле имени пользователя, если хотите войти по электронной почте, но AbstractBaseUser это дает вам полный контроль, если это необходимо.
Могу ли я переключиться на пользовательскую модель пользователя после запуска моего проекта?
Технически, да, но это очень рискованно. Вам придется перенести все ваши данные вручную, что может быть болезненным процессом. Если есть возможность, спланируйте это с самого начала.
Что произойдет, если я забуду установить AUTH_USER_MODEL?
Django будет использовать модель по умолчанию User, и ее последующее изменение может вызвать серьезные проблемы с вашей базой данных и миграциями. Так что не забывайте!
Заключительные мысли
Расширение пользовательской модели Django на первый взгляд может показаться сложной задачей, но как только вы узнаете, какой метод использовать, это станет просто еще одной частью настройки вашего проекта.
Прежде чем приступить к работе, подумайте о потребностях вашего проекта. Правильный подход в дальнейшем избавит вас от массы головной боли.
Итак, как вы планируете расширить свою пользовательскую модель Django и какие поля вам нужно добавить?