2014-12-07 3 views
7

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

So zum Beispiel, wenn sich ein Benutzer mit „[email protected]“ wird seinen Benutzernamen sein „einige Benutzer“ und wenn ein anderer Benutzer meldet sich mit "some-Benutzer @ gmail.comsome-UserR "

„ dann wird sein Benutzername sein“Aber ich will, was ist der Benutzername und E-Mail des Benutzers den gleichen Wert hat.

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

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

In meinem settings.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 
+0

Warum benötigen Sie den Benutzernamen, der der E-Mail entspricht? Sie können Ihrem Benutzer erlauben, sich trotzdem mit der E-Mail-Adresse anzumelden. –

Antwort

6

ich tun genau das, was Sie mit einem Signal auf Benutzer pre_save tun wollen.

Ihre Einstellungen aussehen ok, also wenn Sie den folgenden Code in irgendwo hinzufügen wie zum Beispiel core.models.py es wird funktionieren, wie Sie benötigen:

@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 tun, ist, dass ich, dass jeder will Zeit Benutzer wird gespeichert, der Benutzername wird aktualisiert. Sie könnten überprüfen, ob sich 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 max Länge von Benutzername ist 30 Zeichen):

username = user_email[:30] 

Sie könnten auch die max Länge von Benutzernamen ändern, aber in meinem Fall habe ich lieber um die Standardlänge zu verwenden.

Da ich dies mache, könnte es vorkommen, dass es wiederholte Benutzernamen gibt. Wiederholten Benutzername zu vermeiden, in dem Fall, dass nach den resultierenden Benutzername auf 30 Zeichen zu begrenzen bereits vorhanden ist, hat ich -2, -3 ... am Ende die Benutzername eindeutig zu machen:

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, dass diese Lösung hilft dir!

+1

Danke! Gute Antwort! Das ist genau was ich will. Entschuldigung, dass ich dich nicht aufrüsten kann. Ich habe noch nicht genug Ansehen. Wenn ich habe, werde ich wählen. – GregC

+0

Gut zu hören, dass es geholfen hat! :) – ferrangb