Django - профили пользователей разных типов - PullRequest
13 голосов
/ 12 июля 2011

У меня есть приложение Django, которое позволяет пользователям разных типов: фирмам, администраторам, внешним сотрудникам и т. Д. Конечно, все это легко управлять с помощью стандартной системы аутентификации и групп.

Моя проблема в том, чтопользователи, принадлежащие к разным группам, будут иметь различную связанную информацию - например, фирмы должны будут предоставить некоторую коммерческую информацию, которая не имеет смысла для частных пользователей.Поэтому мне нужно прикрепить разные профили в зависимости от группы.(В моем приложении группы являются взаимоисключающими.)

К сожалению, Django разрешает присоединять только одну модель в качестве профиля, и эта модель объявлена ​​в settings.AUTH_PROFILE_MODULE.Внутренне это извлекается методом User.get_profile(), который в основном просто читает это значение и выполняет некоторые проверки, например, что модель действительно существует.

Я думал о создании подкласса User и переопределении get_profile() метод, так что он возвращает другую модель в зависимости от группы.

Существует ли более простой / понятный способ управления различными типами профилей?

Кто япредложение кажется немного взломанным, учитывая, что пользовательские профили были введены именно для того, чтобы не создавать подкласс User.

1 Ответ

16 голосов
/ 12 июля 2011

Создать модель с OneToOneField до User и related_name.

E. g.:

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.

...