Gibt es eine gute Möglichkeit, dies in Django zu tun, ohne mein eigenes Authentifizierungssystem zu rollen? Ich möchte, dass der Benutzername die E-Mail-Adresse des Benutzers ist, anstatt dass er einen Benutzernamen erstellt.
Bitte raten Sie, danke.
python
django
authentication
Damon
quelle
quelle
Antworten:
Für alle anderen, die dies tun möchten, würde ich empfehlen, einen Blick auf django-email-as-username zu werfen. Dies ist eine ziemlich umfassende Lösung, die unter anderem das Patchen des Admin- und des
createsuperuser
Verwaltungsbefehls umfasst .Bearbeiten : Ab Django 1.5 sollten Sie ein benutzerdefiniertes Benutzermodell anstelle von django-email-as-username verwenden .
quelle
Folgendes machen wir. Es ist keine "vollständige" Lösung, aber es macht viel von dem, was Sie suchen.
quelle
Hier ist eine Möglichkeit, damit sowohl der Benutzername als auch die E-Mail-Adresse akzeptiert werden:
Sie wissen nicht, ob es eine Einstellung zum Festlegen des Standardauthentifizierungsformulars gibt, aber Sie können die URL auch in urls.py überschreiben
Durch Auslösen des ValidationError werden 500 Fehler verhindert, wenn eine ungültige E-Mail gesendet wird. Durch die Verwendung der Super-Definition für "invalid_login" bleibt die Fehlermeldung mehrdeutig (im Vergleich zu einem bestimmten "Kein Benutzer durch diese E-Mail gefunden"), die erforderlich wäre, um zu verhindern, dass bekannt wird, ob eine E-Mail-Adresse für ein Konto in Ihrem Dienst angemeldet ist. Wenn diese Informationen in Ihrer Architektur nicht sicher sind, ist es möglicherweise freundlicher, eine informativere Fehlermeldung zu erhalten.
quelle
Django bietet jetzt ein vollständiges Beispiel für ein erweitertes Authentifizierungssystem mit Administrator und Formular: https://docs.djangoproject.com/de/stable/topics/auth/customizing/#a-full-example
Sie können es grundsätzlich kopieren / einfügen und anpassen (das brauchte ich
date_of_birth
in meinem Fall nicht).Es ist tatsächlich seit Django 1.5 verfügbar und ist ab sofort noch verfügbar (Django 1.7).
quelle
Wenn Sie das Benutzermodell erweitern möchten, müssen Sie trotzdem ein benutzerdefiniertes Benutzermodell implementieren.
Hier ist ein Beispiel für Django 1.8. Django 1.7 würde ein wenig mehr Arbeit erfordern und meistens die Standardformulare ändern (werfen Sie einen Blick auf
UserChangeForm
&UserCreationForm
indjango.contrib.auth.forms
- das ist es, was Sie in 1.7 brauchen).user_manager.py:
models.py:
forms.py:
settings.py:
quelle
username
Feld zumSiteUser
Modell hinzufügen , da ich beim Ausführen despython manage.py makemigrations ...
Befehls die folgende AusgabeERRORS: <class 'accounts.admin.UserAdmin'>: (admin.E033) The value of 'ordering[0]' refers to 'username', which is not an attribute of 'accounts.User'.
username
FeldUser
mit ihremnull=True
Attribut zu meinem Modell hinzugefügt . In diesem Einfügefacheintrag wollte ich die Implementierung zeigen. pastebin.com/W1PgLrD9Andere Alternativen scheinen mir zu komplex zu sein, deshalb habe ich ein Snippet geschrieben, mit dem ich mich mit Benutzername, E-Mail oder beidem authentifizieren und die Groß- und Kleinschreibung aktivieren oder deaktivieren kann. Ich habe es als Django-Dual-Authentifizierung auf pip hochgeladen .
quelle
Die neueste Version der Django-Registrierung ermöglicht einige nette Anpassungen und könnte den Job erledigen - Dokumente hier https://bitbucket.org/ubernostrum/django-registration/src/fad7080fe769/docs/backend-api.rst
quelle
funktioniert perfekt ... für django 1.11.4
quelle
Eine interessante Diskussion zu diesem Thema finden Sie auch unter folgendem Link:
http://groups.google.com/group/django-users/browse_thread/thread/c943ede66e6807c/2fbf2afeade397eb#2fbf2afeade397eb
quelle
Am einfachsten ist es, den Benutzernamen anhand der E-Mail-Adresse in der Anmeldeansicht zu suchen. Auf diese Weise können Sie alles andere in Ruhe lassen:
Stellen Sie in Ihrer Vorlage die nächste Variable entsprechend ein, dh
Und geben Sie Ihrem Benutzernamen / Passwort die richtigen Namen, dh Benutzername, Passwort.
UPDATE :
Alternativ kann der Aufruf if _is_valid_email (email): durch if '@' im Benutzernamen ersetzt werden. Auf diese Weise können Sie die Funktion _is_valid_email löschen. Dies hängt wirklich davon ab, wie Sie Ihren Benutzernamen definieren. Es funktioniert nicht, wenn Sie das Zeichen '@' in Ihren Benutzernamen zulassen.
quelle
Ich denke, der schnellste Weg ist, ein Formular zu erstellen, von dem geerbt wird
UserCreateForm
, und dann dasusername
Feld mit zu überschreibenforms.EmailField
. Dann muss sich jeder neue Registrierungsbenutzer mit seiner E-Mail-Adresse anmelden.Beispielsweise:
urls.py
views.py
signon.html
quelle
UserCreationForm
Klasse verwendet werden soll? Und bitte empfehlen Sie nicht zu schreiben,<input …
wann es sicher{{form.username}}
besser ist.Ich bin mir nicht sicher, ob die Leute versuchen, dies zu erreichen, aber ich habe eine gute (und saubere) Möglichkeit gefunden, nur nach der E-Mail zu fragen und dann vor dem Speichern den Benutzernamen als E-Mail in der Ansicht festzulegen.
Mein UserForm benötigt nur die E-Mail-Adresse und das Passwort:
Dann füge ich meiner Ansicht nach die folgende Logik hinzu:
quelle