Wie kann das Benutzermodell (zusammen mit der Authentifizierungs-App von Django) am besten um benutzerdefinierte Felder erweitert werden? Möglicherweise möchte ich auch die E-Mail als Benutzernamen verwenden (zur Authentifizierung).
Ich habe bereits einige Möglichkeiten gesehen , kann mich aber nicht entscheiden, welche die beste ist.
Antworten:
Der am wenigsten schmerzhafte und in der Tat von Django empfohlene Weg, dies zu tun, ist durch eine
OneToOneField(User)
Eigenschaft.Das heißt, es zu erweitern
django.contrib.auth.models.User
und zu ersetzen funktioniert auch ...Ich würde mich definitiv davon fernhalten, die tatsächliche Benutzerklasse in Ihrem Django-Quellbaum zu ändern und / oder das Auth-Modul zu kopieren und zu ändern.
quelle
user = models.ForeignKey(User, unique=True)
ist das das gleiche wieuser = models.OneToOneField(User)
? Ich würde denken, der Endeffekt ist der gleiche? Aber vielleicht ist die Implementierung im Backend anders.Hinweis: Diese Antwort ist veraltet. Weitere Antworten finden Sie, wenn Sie Django 1.7 oder höher verwenden.
So mache ich es.
Dadurch wird jedes Mal ein Benutzerprofil erstellt, wenn ein Benutzer gespeichert wird, wenn er erstellt wird. Sie können dann verwenden
Hier finden Sie weitere Informationen aus den Dokumenten
http://docs.djangoproject.com/de/dev/topics/auth/#storing-additional-information-about-users
Update: Bitte beachten Sie, dass dies
AUTH_PROFILE_MODULE
seit Version 1.5 veraltet ist: https://docs.djangoproject.com/de/1.5/ref/settings/#auth-profile-modulequelle
user = models.ForeignKey( User )
das Profilobjekt verwenden und über abrufenuser.get_profile()
. Denken Sie daranfrom django.contrib.admin.models import User
.User
Nun, seit 2008 ist einige Zeit vergangen und es ist Zeit für eine neue Antwort. Seit Django 1.5 können Sie benutzerdefinierte Benutzerklassen erstellen. Zum Zeitpunkt, an dem ich dies schreibe, ist es bereits in master zusammengeführt, sodass Sie es ausprobieren können.
In diesem Commit finden Sie einige Informationen dazu in Dokumenten oder wenn Sie sich eingehender damit befassen möchten .
Alles, was Sie tun müssen, ist
AUTH_USER_MODEL
, Einstellungen mit dem Pfad zur benutzerdefinierten Benutzerklasse hinzuzufügen , der entweder erweitertAbstractBaseUser
(anpassbarere Version) oderAbstractUser
(mehr oder weniger alte Benutzerklasse, die Sie erweitern können).Für Leute, die faul sind zu klicken, hier das Codebeispiel (aus Dokumenten entnommen ):
quelle
email
ist der Benutzername.unique=True
dem E-Mail-Feld hinzufügen ,USERNAME_FIELD
damit es akzeptiert wirdSeit Django 1.5 können Sie das Benutzermodell problemlos erweitern und eine einzelne Tabelle in der Datenbank behalten.
Sie müssen es auch als aktuelle Benutzerklasse in Ihrer Einstellungsdatei konfigurieren
Wenn Sie viele Benutzereinstellungen hinzufügen möchten, ist die OneToOneField-Option möglicherweise die bessere Wahl.
Ein Hinweis für Benutzer, die Bibliotheken von Drittanbietern entwickeln: Wenn Sie auf die Benutzerklasse zugreifen müssen, denken Sie daran, dass Benutzer diese ändern können. Verwenden Sie den offiziellen Helfer, um die richtige Klasse zu finden
quelle
django_social_auth
, empfehle ich die Verwendung einer OneToOne-Beziehung. Verwenden Sie diese Methode NICHT, da dies Ihre Migrationen durcheinander bringt.django_social_auth
Plugin zu kombinieren und AUTH_USER_MODEL für den Benutzer der sozialen Authentifizierung zu definieren. Als ich dann manage.py migrate ausführte, war meine App durcheinander. Als ich stattdessen das Social-Auth-Benutzermodell als OneToOne-Beziehung verwendete, wurde hier beschrieben: 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
Quelle zu tun : docs.djangoproject.com/de/dev/topics/auth/customizing/…Es gibt eine offizielle Empfehlung zum Speichern zusätzlicher Informationen über Benutzer . Das Django-Buch behandelt dieses Problem auch im Abschnitt Profile .
quelle
Das Folgende ist ein weiterer Ansatz zum Erweitern eines Benutzers. Ich denke, es ist klarer, einfacher und lesbarer als über zwei Ansätzen.
http://scottbarnham.com/blog/2008/08/21/extending-the-django-user-model-with-inheritance/
Verwenden Sie den obigen Ansatz:
quelle
Sie können das Benutzerprofil einfach erweitern, indem Sie jedes Mal, wenn ein Benutzer mithilfe von Django-Post-Save-Signalen erstellt wird, einen neuen Eintrag erstellen
models.py
Dadurch wird automatisch eine Mitarbeiterinstanz erstellt, wenn ein neuer Benutzer erstellt wird.
Wenn Sie das Benutzermodell erweitern und beim Erstellen eines Benutzers weitere Informationen hinzufügen möchten, können Sie django-betterforms ( http://django-betterforms.readthedocs.io/en/latest/multiform.html) verwenden ). Dadurch wird ein Benutzer-Add-Formular mit allen im UserProfile-Modell definierten Feldern erstellt.
models.py
forms.py
views.py
addUser.html
urls.py
quelle
Erweitern des Django-Benutzermodells (UserProfile) wie ein Profi
Ich fand das sehr nützlich: Link
Ein Auszug:
aus django.contrib.auth.models Benutzer importieren
quelle
Neu in Django 1.5, jetzt können Sie Ihr eigenes benutzerdefiniertes Benutzermodell erstellen (was im obigen Fall eine gute Sache zu sein scheint). Siehe 'Anpassen der Authentifizierung in Django'
Wahrscheinlich die coolste neue Funktion in Version 1.5.
quelle
Dies ist, was ich tue und es ist meiner Meinung nach der einfachste Weg, dies zu tun. Definieren Sie einen Objektmanager für Ihr neues benutzerdefiniertes Modell und definieren Sie dann Ihr Modell.
Vergessen Sie nicht, diese Codezeile in Ihre
settings.py
:Das ist was ich tue und es funktioniert immer.
quelle
Ab Django 2.2 wird beim Starten eines neuen Projekts empfohlen, ein benutzerdefiniertes Benutzermodell zu erstellen, das von AbstractUser erbt, und dann AUTH_USER_MODEL auf das Modell zu verweisen.
Quelle: https://docs.djangoproject.com/de/2.2/topics/auth/customizing/#using-a-custom-user-model-when-starting-a-project
quelle
Einfacher und effektiver Ansatz ist models.py
quelle