Django-профили пользователей разных типов
У меня есть приложение Django, которое позволяет различным типам пользователей: фирмам, администраторам, внешним людям и т. д. Конечно, всем этим легко управлять с помощью системы аутентификации и групп по умолчанию.
Моя проблема заключается в том, что пользователи, принадлежащие к разным группам, будут иметь различную связанную информацию - например, фирмы должны будут предоставлять некоторую коммерческую информацию, которая не имеет смысла для частных пользователей. Следовательно, мне нужно прикрепить различные виды профилей, в зависимости от группа. (В моем приложении группы взаимоисключающие.)К сожалению, Django позволяет прикрепить в качестве профиля только одну модель, и эта модель объявлена в settings.AUTH_PROFILE_MODULE
. Внутренне, это извлекается методом User.get_profile()
, который в основном просто считывает это значение и выполняет некоторые проверки, например, что модель действительно существует.
User
и переопределении метода get_profile()
, чтобы он возвращал другую модель в зависимости от группы.
Существует ли более простой / чистый способ управления различными типами профилей?
То, что я предлагаю, кажется немного халтурным, учитывая, что профили пользователей были введены именно для того, чтобы избежать необходимости подкласса пользователя.
1 ответ:
Создайте модель с
OneToOneField
поUser
иrelated_name
.Например:
class Firm(models.Model): user = models.OneToOneField(User, related_name='firm') # other fields class External(models.Model): user = models.OneToOneField(User, related_name='external') # other fields
Тогда вы можете проверить существование этих атрибутов в
user
(if hasattr(request.user, 'firm')
) и верните надлежащий экземпляр. Я бы поместил его в пользовательское промежуточное ПО, которое установило быrequest.user_profile
, например.