6

Uso l'accesso incorporato nella mia app. Esistono alcuni backend o pacchetti personalizzati per gestirli. ma molti di loro non sono quello che sto cercando.Django- come utilizzare la vista di login integrata con e-mail al posto del nome utente?

ho reso l'email unica tramite la registrazione di django durante la registrazione. ora tutto ciò che voglio è chiedere l'email nella pagina di login al posto del nome utente.

ma se utilizzo alcuni backend personalizzati come django email as username si blocca quando si utilizza con django-registration.

Non voglio cambiare tutto il backend di autenticazione, voglio solo cambiare la pagina di login.

nel resto del sito, userò il nome utente. p.e nella mia pagina di amministrazione personalizzata quando scrivo:

welcome {{user}} 

deve rendere il nome utente. non e-mail.

ho bisogno di trovare la via d'uscita da questo. sono bloccato.

grazie.

risposta

9

Per impostazione predefinita django.contrib.auth.urls creerà un registro nella pagina da questo schema

(r'^login/$', 'django.contrib.auth.views.login'), 

è necessario evitare/sovrascrivere questo url quindi creare una nuova visualizzazione per gestire un nuovo tipo di accesso.

ad es.

creare un nuovo URL di login nella vostra urls.py

(r'^emaillogin/$', 'email_login_view'), 

creare al fine di sostenere login con la posta elettronica in views.py

# get default authenticate backend 
from django.contrib.auth import authenticate, login 
from django.contrib.auth.models import User 

# create a function to resolve email to username 
def get_user(email): 
    try: 
     return User.objects.get(email=email.lower()) 
    except User.DoesNotExist: 
     return None 

# create a view that authenticate user with email 
def email_login_view(request): 
    email = request.POST['email'] 
    password = request.POST['password'] 
    username = get_user(email) 
    user = authenticate(username=username, password=password) 
    if user is not None: 
     if user.is_active: 
      login(request, user) 
      # Redirect to a success page. 
     else: 
      # Return a 'disabled account' error message 
    else: 
     # Return an 'invalid login' error message. 

Rif: https://docs.djangoproject.com/en/1.4/topics/auth/#django.contrib.auth.login

+0

grazie, ha funzionato :) – alix

2

L'approccio di cui sopra fa non funziona più su django 1.9. Un approccio diverso potrebbe essere quello di sovrascrivere il modulo di autenticazione utilizzato nella vista come:

class EmailLoginForm(AuthenticationForm): 
def clean(self): 
    try: 
     self.cleaned_data["username"] = get_user_model().objects.get(email=self.data["username"]) 
    except ObjectDoesNotExist: 
     self.cleaned_data["username"] = "a_username_that_do_not_exists_anywhere_in_the_site" 
    return super(EmailLoginForm, self).clean() 

Poi, quando definisce l'URL di accesso, definire come questo:

url(r'^login/$', django.contrib.auth.views.login, name="login", kwargs={"authentication_form": EmailLoginForm}), 
url(r'^', include('django.contrib.auth.urls')), 

La cosa migliore l'approccio di cui sopra si è non toccare davvero nulla nel processo di autenticazione. Non è davvero una soluzione "pulita", ma è una soluzione rapida. Come si definisce il percorso di accesso prima di includere auth.urls, verrà valutato al posto del modulo di login di base

Problemi correlati