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, например.