2014-12-07 23 views
7

Mam formularz rejestracji, który prosi tylko o e-mail i hasło. Gdy użytkownik zarejestruje się, django-allauth utworzy nazwę użytkownika dla tego użytkownika, usuwając sufiks "@email" z adresu e-mail użytkownika.django-allauth ustawić nazwę użytkownika tak samo jak e-mail

Tak na przykład, jeśli użytkownik wpisze w górę z „[email protected]”, jego nazwa będzie „jakiś użytkownik” i jeśli inny użytkownik rejestruje up z "jakiegoś użytkownika @ gmail.com „to jego nazwa będzie” pewne-userr "

Ale co chcę jest nazwa użytkownika i adres e-mail od użytkowników, aby mieć tę samą wartość.

Jak skonfigurować django-allauth, aby ustawić nazwy użytkowników jako e-maile użytkowników bez usuwania ich sufiksów?

Jeśli to możliwe, w jaki sposób mogę to zrobić bez tworzenia niestandardowego użytkownika.

W moim 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

Dlaczego chcesz, aby nazwa użytkownika była taka sama jak adres e-mail. Możesz zezwolić swojemu użytkownikowi na zarejestrowanie się za pomocą adresu e-mail. –

Odpowiedz

6

zrobić dokładnie to, co chcesz zrobić z sygnałem na pre_save użytkownika.

Ustawienia wyglądają ok, więc jeśli dodać następujący kod w gdzieś jak na przykład core.models.py to będzie działać jak trzeba:

@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 

powód to zrobić z sygnałem jest, że chcę, aby każdy czas Użytkownik jest zapisany, nazwa użytkownika jest aktualizowana. Możesz sprawdzić, czy e-mail zmienił się, aktualizuj nazwę użytkownika tylko w takim przypadku.

Potem ogranicza użytkownika do pierwszych 30 znaków e-mail (domyślnie maksymalna długość nazwy użytkownika wynosi 30 znaków):

username = user_email[:30] 

Można również zmienić maksymalną długość nazwy użytkownika, ale w moim przypadku wolałem aby użyć domyślnej długości.

Ponieważ to robię, może się zdarzyć, że będą powtarzane nazwy użytkowników. W celu uniknięcia powtórnego nazwy użytkownika, w przypadku, że otrzymany nazwy użytkownika, ograniczając ją do 30 znaków już istnieje, umieścić -2, -3 ... Na koniec, aby użytkownika wyjątkowy:

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 

nadzieję, że to rozwiązanie pomaga Ci!

+1

Dziękujemy! Świetna odpowiedź! Właśnie tego chcę. Przepraszam, że nie mogę cię upomnieć. Nie mam jeszcze wystarczająco dobrej reputacji. Kiedy będę, będę głosować. – GregC

+0

Dobrze słyszeć, że pomogło! :) – ferrangb