Подтвердить что ты не робот

Несколько типов пользователей для Auth в Django

В моем веб-браузере есть два типа пользователей: Клиент и Профессиональный. Есть также два "основных модуля", один для клиентов, чтобы купить вещи и т.д. (Основной сайт), а другой для профессионалов для управления операциями. Для auth я бы хотел:

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

Так как Django не позволит мне использовать две модели для аутентификации. Я создал пользовательскую подклассу модели AbstractBaseUser и которая служит мне базовым классом auth для Client и Professional.

class BaseUser(AbstractBaseUser):
  ...

class Client(BaseUser):
  ...

class Professional(BaseUser):
  ...

Я также изменил параметр AUTH_USER_MODEL на:

AUTH_USER_MODEL = 'myapp.BaseUser'

Я также включил django-allauth для управления регистрацией и аутентификацией пользователя. Но теперь я застрял. Я только начал играть с Django/Python, и я не уверен, как это решить.

Кажется, нет официального рекомендованного способа для этого (Внедрение нескольких типов пользователей с Django 1.5). Должен ли я придерживаться подхода подкласса, или я должен делать отношение OnetoOne, указанное в docs?

Как только я правильно настрою модели, как мне перейти к двум регистрационным формам? Можно ли выполнить это с помощью django-allauth, или мне нужно сделать это вручную?

Насколько я знаю, когда зарегистрирован новый пользователь, в таблице User создается новый базовый пользователь. Но так как я буду создавать пользовательские специализации (Client или Professional), как я должен указать, что я также хочу создать связанные с клиентом данные или связанные с ними данные в соответствующей таблице?

Я новичок в Django, поэтому любой совет поможет

4b9b3361

Ответ 1

Я думаю, что самый простой способ сделать то, о чем вы говорите, - это иметь 3 приложения в вашем проекте: ваше приложение на верхнем уровне, "профессиональное" приложение и "клиентское" приложение. В приложении верхнего уровня все, что вам действительно нужно сделать, это предоставить пользователям форму входа и 2 ссылки, одну для регистрации в качестве профессионала и одну для регистрации в качестве Клиента.

В этом случае я считаю, что вам будет проще использовать Django, встроенную в систему Permissions, и назначить каждого типа пользователей соответствующей группе (например, профессионалам и клиентам). Вы можете использовать декоратор на своих представлениях, чтобы обеспечить доступ к этому представлению только членам определенной группы (поскольку у вас есть 2 отдельных приложения для каждой группы, вы можете добавить декоратор ко всем представлениям в каждом из них или импортировать Django авторизации в ваш urls.py и проверьте его там, хотя это выходит за рамки этого ответа).

Регистрация достаточно проста, используйте свой urls.py файл для пересылки пользователю, который хочет зарегистрироваться, в нужное приложение. Как только вы это сделаете, вы сможете использовать регистрацию django-allauth для каждого приложения, что позволит вам создать 2 разных пользователя. Убедитесь, что в регистре вы назначаете их правильному членству в группе.

Что касается перенаправления входа в систему, как только вы получите данные POST, я бы проверил, для какого типа пользователя вошел в систему, и используйте это для перенаправления пользователя на правильный URL-адрес, который входит в приложение "Профессионал" или "Клиент". Вы можете увидеть приведенную ниже ссылку для идеи перенаправления пользователя после входа в систему.

Django - после входа в систему перенаправить пользователя на свою страницу → mysite.com/username