При развёртывании Django в проекте сразу автоматически создаётся модель пользователя User
с предустановленными атрибутами
Это лишь основные; полный список атрибутов описан в документации.
Обычно этой модели хватает для решения задач, связанных с управлением пользователями.
Однако часто возникает необходимость расширить модель User
. Например, требуется добавить в профайл биографию, дату рождения, должность, фотографию или что-нибудь ещё.
Существуют три основных способа сделать это.
- Создать собственную модель пользователя, унаследовав её от
AbstractUser
. Такая модель будет содержать все те же поля, что и стандартная модель пользователя, но в кастомной модели можно добавлять и удалять поля и методы. Создавать такую модель нужно в самом начале работы, до первой миграции. - Наследование от
AbstractBaseUser
. Эту стратегию выбирают, если нужно значительно изменить поведение модели пользователя. Такую модель также нужно создавать в самом начале работы над проектом, до применения миграций. - Добавить в существующую модель связь «один-к-одному» с новой моделью, в которой будут храниться дополнительные поля. Этот подход применим даже в том случае, если проект уже разрабатывается, а база данных наполнена.
У этого способа есть свои недостатки — нужно будет дополнительно оптимизировать запросы к связанной модели и настраивать админку; но он выручит в том случае, если уже по ходу разработки появилась необходимость расширить модель User
.
Расширение пользовательской модели: наследование от AbstractUser
Скачайте и разверните учебный проект, он станет наглядным пособием для этого урока. Весь код, связанный с управлением пользователями, хранится в приложении User
.
Расширим модель пользователя: добавим в неё поле «Биография». Для этого создадим собственную модель, унаследовав её от модели AbstractUser
.AbstractUser
— это абстрактный класс, полная модель пользователя со всеми необходимыми полями; от этого класса можно наследовать кастомные модели пользователя и добавлять собственные поля и методы профиля.Создадим собственную модель User
и добавим в неё текстовое поле «Биография».
# abstract_user/users/models.py
from django.contrib.auth.models import AbstractUser
from django.db import models
class User(AbstractUser):
bio = models.TextField(
'Биография',
blank=True,
)
В файле с настройками укажем, что вместо стандартной модели пользователя нужно использовать модель из приложения users.
# abstract_user/abstract_user/settings.py
...
AUTH_USER_MODEL = 'users.User'
Зарегистрируем новую модель пользователя в админке:
# abstract_user/users/admin.py
from django.contrib import admin
from .models import User
admin.site.register(User)
Выполняем миграции:
(venv) ...$ python3 manage.py makemigrations
Migrations for 'users':
users/migrations/0001_initial.py
- Create model User
Готово. В модели пользователя появилось дополнительное поле, оно доступно в админ-зоне проекта:
Заключение
Переопределяйте стандартную модель пользователя в каждом новом Django-проекте до начала работы с базой и первыми миграциями. Это несложно, а в дальнейшем убережёт от лишних проблем.