Кастомизация модели User в Django

При развёртывании Django в проекте сразу автоматически создаётся модель пользователя User с предустановленными атрибутами

Это лишь основные; полный список атрибутов описан в документации.

Обычно этой модели хватает для решения задач, связанных с управлением пользователями.

Однако часто возникает необходимость расширить модель User. Например, требуется добавить в профайл биографию, дату рождения, должность, фотографию или что-нибудь ещё.

Существуют три основных способа сделать это.

  1. Создать собственную модель пользователя, унаследовав её от AbstractUser. Такая модель будет содержать все те же поля, что и стандартная модель пользователя, но в кастомной модели можно добавлять и удалять поля и методы. Создавать такую модель нужно в самом начале работы, до первой миграции.
  2. Наследование от AbstractBaseUser. Эту стратегию выбирают, если нужно значительно изменить поведение модели пользователя. Такую модель также нужно создавать в самом начале работы над проектом, до применения миграций.
  3. Добавить в существующую модель связь «один-к-одному» с новой моделью, в которой будут храниться дополнительные поля. Этот подход применим даже в том случае, если проект уже разрабатывается, а база данных наполнена.

У этого способа есть свои недостатки — нужно будет дополнительно оптимизировать запросы к связанной модели и настраивать админку; но он выручит в том случае, если уже по ходу разработки появилась необходимость расширить модель 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-проекте до начала работы с базой и первыми миграциями. Это несложно, а в дальнейшем убережёт от лишних проблем.





Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: