Jaki jest najlepszy sposób rozszerzenia modelu użytkownika (w pakiecie z aplikacją uwierzytelniającą Django) o pola niestandardowe? Chciałbym również użyć adresu e-mail jako nazwy użytkownika (do celów uwierzytelnienia).
Widziałem już kilka sposobów, aby to zrobić, ale nie mogę zdecydować, który z nich jest najlepszy.
Odpowiedzi:
Najmniej bolesnym i rzeczywiście polecanym przez Django sposobem na zrobienie tego jest
OneToOneField(User)
własność.To powiedziawszy, rozszerzenie
django.contrib.auth.models.User
i zastąpienie działa również ...Na pewno trzymałbym się z daleka od zmiany faktycznej klasy User w twoim drzewie źródłowym Django i / lub kopiowania i modyfikowania modułu auth.
źródło
user = models.ForeignKey(User, unique=True)
czy to to samo couser = models.OneToOneField(User)
? Myślałem, że efekt końcowy jest taki sam? Ale może implementacja w backendie jest inna.Uwaga: ta odpowiedź jest nieaktualna. zobacz inne odpowiedzi, jeśli używasz Django 1.7 lub nowszego.
Tak to robię.
Spowoduje to utworzenie profilu użytkownika za każdym razem, gdy użytkownik zostanie zapisany, jeśli został utworzony. Następnie możesz użyć
Oto więcej informacji z dokumentów
http://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users
Aktualizacja: należy pamiętać, że
AUTH_PROFILE_MODULE
jest przestarzała od wersji 1.5: https://docs.djangoproject.com/en/1.5/ref/settings/#auth-profile-moduleźródło
user = models.ForeignKey( User )
i pobierać obiekt profilu za pośrednictwemuser.get_profile()
. Pamiętaj, abyfrom django.contrib.admin.models import User
.User
Minęło trochę czasu od 2008 roku i czas na świeżą odpowiedź. Od wersji Django 1.5 będziesz mógł tworzyć niestandardowe klasy użytkowników. Właściwie w chwili, gdy to piszę, jest on już scalony w master, więc możesz go wypróbować.
Jest trochę informacji na ten temat w dokumentach lub jeśli chcesz zagłębić się w to, w tym zatwierdzeniu .
Wszystko, co musisz zrobić, to dodać
AUTH_USER_MODEL
ustawienia ze ścieżką do niestandardowej klasy użytkownika, która rozszerza alboAbstractBaseUser
(bardziej konfigurowalną wersję), alboAbstractUser
(mniej lub bardziej starą klasę użytkownika, którą możesz rozszerzyć).Dla osób, które leniwie klikają, oto przykładowy kod (zaczerpnięty z dokumentów ):
źródło
email
jest to nazwa użytkownika.unique=True
do pola adresu e-mail, aby zezwolić naUSERNAME_FIELD
akceptacjęOd wersji Django 1.5 możesz łatwo rozszerzyć model użytkownika i zachować jedną tabelę w bazie danych.
Musisz również skonfigurować go jako bieżącą klasę użytkownika w pliku ustawień
Jeśli chcesz dodać wiele preferencji użytkowników, lepszym wyborem może być opcja OneToOneField.
Uwaga dla osób tworzących biblioteki stron trzecich: jeśli potrzebujesz dostępu do klasy użytkownika, pamiętaj, że ludzie mogą to zmienić. Skorzystaj z oficjalnego pomocnika, aby uzyskać odpowiednią klasę
źródło
django_social_auth
, zalecam użycie relacji OneToOne. NIE używaj tej metody, bo spowoduje to popsucie migracji.django_social_auth
wtyczkę i zdefiniować AUTH_USER_MODEL dla użytkownika autoryzacji społecznościowej. Następnie, kiedy uruchomiłem manage.py migrację, zepsuła moją aplikację. Kiedy zamiast tego użyłem modelu użytkownika autoryzacji społecznościowej jako relacji OneToOne opisanej tutaj: stackoverflow.com/q/10638293/977116Changing this setting after you have tables created is not supported by makemigrations and will result in you having to manually write a set of migrations to fix your schema
źródłem: docs.djangoproject.com/en/dev/topics/auth/customizing/…Istnieje oficjalne zalecenie dotyczące przechowywania dodatkowych informacji o użytkownikach . Książka Django omawia ten problem również w sekcji Profile .
źródło
Poniżej znajduje się inne podejście do rozszerzenia użytkownika. Wydaje mi się, że jest to bardziej jasne, łatwe, czytelne niż w przypadku dwóch podejść.
http://scottbarnham.com/blog/2008/08/21/extending-the-django-user-model-with-inheritance/
Stosując powyższe podejście:
źródło
Możesz po prostu rozszerzyć profil użytkownika, tworząc nowy wpis za każdym razem, gdy użytkownik jest tworzony przy użyciu sygnałów zapisu postu Django
models.py
Spowoduje to automatyczne utworzenie instancji pracownika po utworzeniu nowego użytkownika.
Jeśli chcesz rozszerzyć model użytkownika i chcesz dodać dodatkowe informacje podczas tworzenia użytkownika, możesz użyć django-betterforms ( http://django-betterforms.readthedocs.io/en/latest/multiform.html ). Spowoduje to utworzenie formularza dodawania użytkownika ze wszystkimi polami zdefiniowanymi w modelu UserProfile.
models.py
forms.py
views.py
addUser.html
urls.py
źródło
Rozszerzanie modelu użytkownika Django (UserProfile) jak profesjonalista
Znalazłem to bardzo przydatne: link
Ekstrakt:
z importu django.contrib.auth.models Użytkownik
źródło
Nowość w Django 1.5, teraz możesz stworzyć swój własny model użytkownika (co wydaje się być dobrym rozwiązaniem w powyższym przypadku). Zobacz „Dostosowywanie uwierzytelniania w Django”
Prawdopodobnie najfajniejsza nowa funkcja w wersji 1.5.
źródło
To właśnie robię i moim zdaniem jest to najprostszy sposób, aby to zrobić. zdefiniuj menedżera obiektów dla nowego dostosowanego modelu, a następnie zdefiniuj model.
Nie zapomnij dodać tej linii kodu do
settings.py
:To właśnie robię i zawsze działa.
źródło
Obecnie, począwszy od Django 2.2, zalecanym sposobem na rozpoczęcie nowego projektu jest utworzenie niestandardowego modelu użytkownika, który dziedziczy po AbstractUser, a następnie wskazanie modelu AUTH_USER_MODEL.
Źródło: https://docs.djangoproject.com/en/2.2/topics/auth/customizing/#using-a-custom-user-model-when-starting-a-project
źródło
Proste i skuteczne podejście to models.py
źródło