2011-07-12 31 views
12

Mam aplikację Django, która pozwala na różne rodzaje użytkowników: firmy, administratorzy, osoby z zewnątrz itp. Oczywiście wszystko to jest łatwe do zarządzania z domyślnym systemem uwierzytelniania i grupami.Django - Profile użytkowników różnych typów

Moim problemem jest to, że użytkownicy należący do różnych grup będą mieli różne powiązane informacje - na przykład firmy będą musiały dostarczyć informacji handlowych, które nie mają sensu dla użytkowników prywatnych. Dlatego muszę dołączyć różne rodzaje profili, w zależności od grupy. (W moich grupach aplikacji wzajemnie się wykluczam.)

Niestety, Django zezwala tylko na dołączenie pojedynczego modelu jako profilu, a ten model jest zadeklarowany w settings.AUTH_PROFILE_MODULE. Wewnętrznie, który jest pobierany przez metodę User.get_profile(), która w zasadzie po prostu odczytuje tę wartość i wykonuje pewne sprawdzenia, na przykład, że model faktycznie istnieje.

Zastanawiam się nad podklasowaniem User i nadpisaniem metody get_profile(), dzięki czemu zwraca ona inny model w zależności od grupy.

Is there a simpler/cleaner way to manage different kind of profiles?

To, co proponuję, wydaje się trochę hackować, biorąc pod uwagę, że profile użytkowników zostały wprowadzone dokładnie w celu uniknięcia konieczności posiadania podklasy Użytkownik.

Odpowiedz

16

Utwórz model z OneToOneField na User i related_name.

Np .:

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 

Następnie można sprawdzić existance tego atrybutów user (if hasattr(request.user, 'firm')) i powrót właściwego przypadku. Umieściłbym go w niestandardowym oprogramowaniu pośredniczącym, które ustawiłoby na przykład request.user_profile.

+0

Okazuje się, że jest to najprostszy sposób. Moim problemem jest teraz zagwarantowanie, że te profile są rzeczywiście wypełniane przez administratora. http://stackoverflow.com/questions/6681464/django-admin-validating-inlines-together-with-main-models – Andrea

+0

Ten model użytkownika nie jest domyślną rzeczą, która pochodzi z Django, prawda? Ponieważ dostaję 'NameError: nazwa 'Użytkownik' nie jest zdefiniowany' kiedy próbuję tego –

+1

@JulioMarins Tak, powinieneś go zaimportować:' from django.contrib.auth.models import User'' – DrTyrsa

Powiązane problemy