2013-06-05 13 views
14

Moja strona internetowa zawiera dwa typy użytkowników: Klient i Professional. Istnieją również dwa "główne moduły", jeden dla klientów do zakupu rzeczy i tak dalej (strona główna), a drugi dla profesjonalistów do zarządzania operacjami. Dla uwierzytelniania, chciałbym mieć:Wiele typów użytkowników Auth w Django

  • jednego „wejść” formularza, który wykrywa, czy użytkownik jest klientem lub profesjonalny i przekazuje ją do prawej strony modułu (głównej lub strony kierownictwa).
  • Dwie formy "rejestracji", jedna dla klientów i inna dla profesjonalistów. Prawdopodobnie strona zapyta użytkownika, czy chce zarejestrować się jako profesjonalny lub jako klient, aby uruchomić odpowiedni przepływ rejestracji dla każdego przypadku.
  • Klienci będą używać "strony głównej" i nie powinni mieć autoryzacji do korzystania z "witryny zarządzania".
  • Specjaliści wykorzystają "witrynę zarządzania", ale nie powinni mieć uprawnień do logowania się na stronie głównej.
  • Zarówno profesjonaliści i klienci są zarejestrowani jako użytkownicy, i wspólne obszary, takie jak nazwa użytkownika, telefon, email, etc ...

Ponieważ Django nie pozwoli mi korzystać z dwóch modeli do uwierzytelniania. Stworzyłem niestandardową podklasę modelu AbstractBaseUser, która służy mi jako podstawowa klasa auth dla klientów i profesjonalistów.

class BaseUser(AbstractBaseUser): 
    ... 

class Client(BaseUser): 
    ... 

class Professional(BaseUser): 
    ... 

Ja również zmienił ustawienie AUTH_USER_MODEL do:

AUTH_USER_MODEL = 'myapp.BaseUser' 

Mam również django-allauth zarządzać rejestracji użytkownika i uwierzytelniania. Ale teraz utknąłem. Właśnie zacząłem grać z Django/Pythonem i nie jestem pewien, jak rozwiązać ten problem.

Wygląda na to, że nie ma oficjalnego zalecanego sposobu (Implementing multiple user types with Django 1.5). Czy powinienem trzymać się podejścia opartego na podklasach, czy też powinienem wykonać relację OnetoOne wskazaną w docs?

Kiedy mam poprawnie skonfigurowane modele, jak mam postępować z dwoma formularzami rejestracyjnymi? Czy można to osiągnąć za pomocą django-allauth, czy też muszę to zrobić ręcznie?

O ile mi wiadomo, po zarejestrowaniu nowego użytkownika w tabeli użytkownika tworzony jest nowy użytkownik podstawowy. Ale skoro będę tworzyć specjalizacje użytkownika (klienta lub profesjonalisty), jak powinienem określić, że chcę również utworzyć dane związane z klientem lub dane związane z zawodem w odpowiedniej tabeli?

Jestem całkiem nowy, Django, więc każda rada pomoże

Odpowiedz

8

myślę najprostszy sposób, aby robić to, co mówisz będzie mieć 3 aplikacje w projekcie: swój najwyższy poziom aplikacja, "profesjonalna" aplikacja i aplikacja "klient". W aplikacji na najwyższym poziomie wszystko, co naprawdę musisz zrobić, to dać użytkownikom formularz logowania i 2 linki, jeden do rejestracji jako profesjonalny i jeden do rejestracji jako klient.

W tym przypadku uważam, że najłatwiej będzie użyć systemu uprawnień wbudowanego w Django i przypisać każdy typ użytkownika do odpowiedniej grupy (np. Specjalistów i klientów).Możesz użyć dekoratora na swoich widokach, aby upewnić się, że tylko członkowie konkretnej grupy mają dostęp do tego widoku (ponieważ masz 2 oddzielne aplikacje dla każdej grupy, możesz dodać dekorator do wszystkich widoków w każdej z nich lub możesz zaimportować Django funkcje autoryzacji do twojego urls.py i sprawdź to, chociaż to wykracza poza zakres tej odpowiedzi).

Rejestracja jest łatwa, użyj pliku urls.py, aby przesłać użytkownika, który chce zarejestrować się w odpowiedniej aplikacji. Gdy to zrobisz, powinieneś być w stanie użyć rejestracji django-allauth dla każdej aplikacji, co pozwoli ci utworzyć 2 różnych rodzajów użytkowników. Upewnij się, że podczas rejestracji przypisujesz je do prawidłowego członkostwa w grupie.

Jeśli chodzi o przekierowanie logowania, po otrzymaniu danych POST, sprawdziłbym, jakiego typu użytkownik się zalogował, i użył tego, aby przekierować użytkownika na poprawny adres URL, który pasuje do aplikacji Professional lub Client. Poniżej znajduje się link do pomysłu przekierowania użytkownika po zalogowaniu.

Django - after login, redirect user to his custom page --> mysite.com/username

+0

Dzięki, dałeś mi świetne wskazówki dotyczące układu projektu. Ale co z modelami? Czy sądzisz, że stworzenie dwóch modeli Professional i Client z OneToOnefield łączących się z modelem użytkownika jest w porządku? W ten sposób mógłbym z łatwością zarządzać obydwoma typami użytkowników, tak myślę ... – jaime

+2

Jest to z pewnością opcja, i niekoniecznie jest zła, chyba że chcesz skalować. Inną opcją jest utworzenie wszystkich pól w jednym modelu użytkownika i użycie funkcji modelu do zdefiniowania, które pola dotyczą różnych rodzajów użytkowników. Zasadniczo, zamiast tego, że twój silnik DB definiuje, które pola mogą nie być wartościami null, lub wartościami granicznymi, lub cokolwiek innego w tym zakresie, możesz sprawić, że Django wymusi integralność i uzyska nieco większą elastyczność w tym, jakie wpisy możesz wykonać za pomocą pojedynczego Model. –

+0

@TitusP, proszę spojrzeć na to pytanie: http://stackoverflow.com/questions/35252375/trouble-understaing-user-object-in-django?noredirect=1#comment58217925_35252375 – user3497437