Лучшие практики Django в отношении пользовательских моделей пользователей
Это скорее общий вопрос о лучших практиках. Когда вы начинаете новый проект в Django, вы обычно создаете пользовательскую модель User или полагаетесь на модель по умолчанию?
Лично мне кажется более чистым, если я не буду возиться с моделью User по умолчанию. Если есть дополнительные атрибуты, которые я хочу добавить, мне кажется, что проще добавить модель Profile
или UserInfo
с отношением один-к-одному/внешний ключ с User.
Однако многие статьи, которые я читал о Django, не согласны с этим. По-видимому, рекомендуется создавать пользовательскую модель User? Мне интересно, как поступают все, и что именно я упускаю, если сделаю один из этих вариантов
Пользовательская модель пользователя - это хорошая практика, когда вам нужно добавить новые поля или логику в модель пользователя (например, вход в систему с использованием электронной почты вместо имени пользователя или добавление новых разрешений). Если ваше приложение простое и вам не нужно добавлять новые поля, вы можете использовать модель пользователя по умолчанию. Другим решением является сохранение модели пользователя и создание модели "Профиль пользователя" с отношением OneToOne к User, но вам придется создавать профиль вручную и добавлять его к User, или, возможно, использовать сигналы django для создания профиля User каждый раз, когда создается новый пользователь. Я лично не рекомендую последнее решение. Итак, вы должны создать пользовательскую модель User, если вам нужно добавить новые поля или логику, в противном случае придерживайтесь модели User по умолчанию. Если вы используете пользовательскую модель, не забудьте добавить новые поля в админку сайта. Вот пример
class User(AbstractUser):
worker = models.OneToOneField(WorkerModel, on_delete=models.CASCADE,
related_name="user", verbose_name=_("Trabajador"), null=True, blank=True)
job = models.CharField(verbose_name="Cargo",max_length=50, null=True, blank=True)
department = models.CharField(verbose_name="Departamento",max_length=50, null=True, blank=True)
avatar = models.ImageField(verbose_name="Imagen", upload_to="user_avatar",
null=True, blank=True)
class Meta:
default_permissions = ()
verbose_name="Usuario"
verbose_name_plural="Usuarios"
permissions = (
("secretario", "Secretario(a)"),
("director", "Director"),
)
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import User #, UserProfileModel
from django.utils.translation import gettext, gettext_lazy as _
class UserAdminInherited(UserAdmin):
autocomplete_fields = ['worker']
fieldsets = (
(None, {'fields': ('username', 'password')}),
(_('Personal info'), {'fields': ('first_name', 'last_name', 'email','job','department','avatar')}),
(_('Worker info'), {'fields': ('worker',)}),
(_('Permissions'), {
'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions'),
}),
(_('Important dates'), {'fields': ('last_login', 'date_joined')}),
)
admin.site.register(User, UserAdminInherited)