2014-12-07 13 views
7

Ho un modulo di registrazione che richiede solo e-mail e password. Quando un utente si iscrive, django-allauth crea un nome utente per tale utente tagliando il suffisso "@email" dell'indirizzo email dell'utente.django-allauth set nome utente uguale a email

Così, per esempio, se un utente si iscrive con "[email protected]" il suo nome utente sarà "alcuni utenti" e se un altro utente si iscrive con "alcuni utenti @ gmail.com "allora il suo nome utente sarà" qualche-UserR "

Ma quello che voglio è il nome utente e la posta elettronica degli utenti di avere lo stesso valore.

Quindi, come posso configurare django-allauth per impostare i nomi utente come e-mail degli utenti senza rimuovere i suffissi?

E se possibile, come posso farlo senza creare un utente personalizzato.

Nel mio 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

Perché è necessario il nome utente per essere uguale all'email. Puoi comunque consentire al tuo utente di registrarsi con l'indirizzo email. –

risposta

6

io fare esattamente quello che si vuole fare con un segnale su pre_save utente.

Le impostazioni sembrano ok, quindi se si aggiunge il seguente codice nel posto come per esempio core.models.py che funzionerà come avete bisogno:

@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 

La ragione per cui lo faccio con un segnale è che io voglio che ogni tempo Utente salvato, il nome utente viene aggiornato. Potresti controllare se l'e-mail ha cambiato aggiornare il nome utente solo in quel caso.

Poi mi limitano il nome utente per i primi 30 caratteri di posta elettronica (lunghezza massima predefinita del nome utente è di 30 caratteri):

username = user_email[:30] 

si potrebbe anche modificare la lunghezza massima di nome utente, ma nel mio caso ho preferito usare la lunghezza predefinita.

Da quando faccio questo, potrebbe succedere che ci siano nomi utente ripetuti. Per evitare nomi utente ripetute, nel caso in cui il nome utente risultanti dopo aver limitato a 30 caratteri esiste già, ho messo -2, -3 ... alla fine per fare il nome utente univoco:

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 

Spero che questa soluzione ti aiuta!

+1

Grazie! Bella risposta! Questo è esattamente quello che voglio. Mi dispiace di non poterti invogliare. Non ho ancora abbastanza reputazione. Quando avrò voterò. – GregC

+0

Buono a sapersi che ha aiutato! :) – ferrangb

Problemi correlati