2009-10-29 12 views
7

Co powinienem zrobić, aby rozszerzyć domyślny model użytkownika za pomocą niestandardowych menedżerów?Menedżerowie niestandardowi Django dla modelu użytkownika

Moja aplikacja ma wiele typów użytkowników, które zostaną zdefiniowane przy użyciu wbudowanego modelu Grupy. Tak więc Użytkownik może być klientem, członkiem personelu i tak dalej. Idealnie byłoby móc zrobić coś w rodzaju:

User.clients.filter(name='Test') 

Aby uzyskać wszystkich klientów o nazwie Test. Wiem, jak to zrobić, używając niestandardowych menedżerów dla modeli zdefiniowanych przez użytkownika, ale nie jestem pewien, jak zrobić to z modelem użytkownika, zachowując jednocześnie wszystkie zapakowane gadżety, przynajmniej nie modyfikując kodu źródłowego django sam, który jest nie nie ....

Odpowiedz

-1

można profilu użytkownika dla tego

AUTH_PROFILE_MODULE = „accounts.UserProfile”

Kiedy model profil użytkownika został zdefiniowane i określone w w ten sposób każdy obiekt użytkownika będzie miał metodę - get_profile () - który zwraca instancję modelu profilu użytkownika powiązanego z tym użytkownikiem.

Możesz też napisać własną wersję authenticate backend. Dodano go w ustawieniach

+1

-1 Profile użytkowników są dobre do dodawania dodatkowych atrybutów danych, ale w ogóle nie pomagają w tym przypadku. A twój ostatni blok kodu jest po prostu zepsuty (czy przetestowałeś go?), Nie możesz dodać menedżera do takiej klasy, musisz wywołać metodę add_to_class, aby była poprawnie skonfigurowana. –

+0

Pomaga, przy korzystaniu z modułu profilu zamiast użytkownika. UserProfile.user_clients.filter (name = 'Test') Ale mój ostatni blok jest naprawdę zepsuty. Dzięki. Edytuję swoją odpowiedź. – Oduvan

16

Tak, możesz dodać niestandardowego menedżera bezpośrednio do klasy użytkownika. Jest to monkeypatching i sprawia, że ​​twój kod jest mniej łatwy w utrzymaniu (ktoś próbujący dowiedzieć się, jaki jest twój kod, może nie mieć pojęcia, gdzie klasa użytkownika przejęła tego niestandardowego menedżera lub gdzie mogłaby go szukać). W tym przypadku jest względnie nieszkodliwy, ponieważ w rzeczywistości nie nadpisujesz istniejącego zachowania klasy User, tylko dodajesz coś nowego.

from django.contrib.auth.models import User 
User.add_to_class('clients', ClientsManager()) 

Jeśli używasz Django 1.1+, można również podklasa użytkownika z proxy model; nie wpływa na bazę danych, ale umożliwiłoby dołączenie dodatkowych menedżerów bez monkeypatch.

+0

pomocne, dziękuję. –

+2

@JoseJose proszę oznaczyć tę odpowiedź jako poprawną – sberder

+0

bardzo heplful, dzięki – nemesisdesign

Powiązane problemy