Django-allauth set username das selbe wie email

Ich habe ein Anmeldeformular, das nur nach E-Mail und Passwort fragt. Wenn ein Benutzer sich anmeldet, erstellt django-allauth einen Benutzernamen für diesen Benutzer, indem er das "@email" -Suffix aus der E-Mail-Adresse des Benutzers ablegt.

So zum Beispiel, wenn ein Benutzer sich mit " some-user@example.com " anmeldet, wird sein Benutzername " some-user " sein und wenn ein anderer Benutzer sich mit " some-user@gmail.com " anmeldet, dann ist sein Benutzername " Some-userr "

Aber was ich will, ist der Benutzername und E-Mail der Benutzer, um den gleichen Wert zu haben.

Also, wie kann ich django-allauth konfigurieren, um die Benutzernamen als Benutzer E-Mails ohne Striping ihre Suffixe?

Und wenn möglich, wie kann ich das machen, ohne einen benutzerdefinierten Benutzer zu erstellen.

In meinen Einstellungen.py:

######################### # AllAuth Configuration # ######################### ACCOUNT_AUTHENTICATION_METHOD = 'email' ACCOUNT_EMAIL_REQUIRED = True ACCOUNT_UNIQUE_EMAIL = True ACCOUNT_USERNAME_REQUIRED = False ACCOUNT_EMAIL_VERIFICATION = 'mandatory' ACCOUNT_PASSWORD_MIN_LENGTH = 8 

One Solution collect form web for “Django-allauth set username das selbe wie email”

Ich mache genau das, was du mit einem Signal auf User pre_save machen willst.

Ihre Einstellungen sehen ok aus, also wenn man den folgenden Code irgendwo hinzufügt wie zB core.models.py es funktionieren, wie du brauchst:

 @receiver(pre_save, sender=User) def update_username_from_email(sender, instance, **kwargs): user_email = instance.email username = user_email[:30] n = 1 while User.objects.exclude(pk=instance.pk).filter(username=username).exists(): n += 1 username = user_email[:(29 - len(str(n)))] + '-' + str(n) instance.username = username 

Der Grund, warum ich es mit einem Signal mache ist, dass ich will, dass jedes Mal, wenn Benutzer gespeichert ist, der Benutzername aktualisiert wird. Sie können überprüfen, ob die E-Mail geändert hat, aktualisieren Sie den Benutzernamen nur in diesem Fall.

Dann beschränke ich den Benutzernamen auf die ersten 30 Zeichen der E-Mail (Standard-Maximale Länge des Benutzernamens ist 30 Zeichen):

 username = user_email[:30] 

Du könntest auch die maximale Länge des Benutzernamens ändern, aber in meinem Fall habe ich lieber die Standardlänge benutzt.

Da ich das mache, könnte es passieren, dass es wiederholte Benutzernamen gibt. Um wiederholte Benutzernamen zu vermeiden, falls der resultierende Benutzername nach der Begrenzung auf 30 Zeichen bereits vorhanden ist, habe ich -2, -3 … am Ende den Benutzernamen eindeutig gemacht:

 n = 1 while User.objects.exclude(pk=instance.pk).filter(username=username).exists(): n += 1 username = user_email[:(29 - len(str(n)))] + '-' + str(n) instance.username = username 

Ich hoffe, diese Lösung hilft dir!

  • Daten aus Form und Anzeige in Vorlage abrufen
  • Django: Hinzufügen von Inline-Formate-Zeilen ohne Javascript
  • Wie man <span> anstelle von <li> tag produziert
  • Erstellen Sie eine Zeile des Datums beim Erstellen von Superuser
  • Ändern Sie das klickbare Feld in Django admin list_display
  • Django admin viele zu viele Teilmenge
  • Python ist die beste Programmiersprache der Welt.