Django: Modifica / Permettere nome utente login per l'utente di utilizzare anche il suo / la sua e-mail

StackOverflow https://stackoverflow.com/questions/4267627

Domanda

Come il mio titolo dice, voglio sapere se c'è un modo per consentire a un utente di utilizzare non solo il suo nome utente, ma anche e-mail del suo utente di login. Voglio uniformare la procedura di login, perché in questo momento sto avendo i miei utenti utilizzano molte convenzioni diverse e diventa piuttosto disordinato.

È stato utile?

Soluzione

Si potrebbe probabilmente fare questo se far rispettare indirizzi email unici. Ciò significa che nessun utente può avere lo stesso indirizzo e-mail. In questo modo si potrebbe recuperare l'utente in base all'indirizzo e-mail e il login.

Il modulo potrebbe essere simile a questo:

<form method="post" action="{% url myproject.views.login %}">
     <p>Username</p>
     <input type='text' name='username'/>

     <p>Password</p>
     <input type='password' name='password'/>
     <input type="submit" value="Login"/>
</form>

Il metodo di visualizzazione potrebbe essere simile a questo:

def login( request ):
    username = request.POST['username']
    password = request.POST['password']
    user = User.objects.filter( email = username )[0]
    if( user is not None ):
         # -- the user was retrieved by an email address
         # -- now you can authenticate and log them in log them in
         from django.contrib import auth
         user = auth.authenticate( user.username, password )
         if( user is not None ):
              auth.login( user, request )

OpenID potrebbe essere un altro modo per andare: http://bit.ly/a2OlHX

Assicurarsi indirizzi e-mail uniche per utente: http://bit.ly/aOaAbw

Altri suggerimenti

penso 'risolto' il mio problema, almeno è funzionale, per ora. Ho deciso di usare il mio backend di autenticazione. Ho creato un file 'auth_backends.py' e ha aggiunto al AUTHENTICATION_BACKENDS nel mio settings.py:

I miei campi del modulo d'accesso contiene solo 'username' e la password. L'unico modo che sto facendo per controllare se il nome utente inserito è in realtà il suo nome utente o e-mail, è facendo il .find ( '@'). C'è un modo migliore per verificare la presenza di esso? Questo sarebbe sufficiente? Tutta la ragione che sto facendo questo è perché è più facile per l'utente a ricordare il suo / la sua e-mail che il suo nome utente (che è in realtà un 'id' costituiti da numeri).

Ho anche intenzione di avere a prendersi cura di messaggi di posta elettronica duplicati.

from django.conf import settings
from django.contrib.auth.backends import ModelBackend
from django.core.exceptions import ImproperlyConfigured
from django.db.models import get_model
from django.contrib.auth.models import User

class CustomUserModelBackend(ModelBackend):

def authenticate(self, **credentials):
    if 'username' in credentials:
        if credentials['username'].find('@') > 0:
            return self.authenticate_by_email(**credentials)
        else:
            return self.authenticate_by_username(**credentials)

def authenticate_by_username(self, username=None, password=None):
    try:
        user = User.objects.get(username=username)
        if user.check_password(password):
            return user
    except User.DoesNotExist:
        return None

def authenticate_by_email(self, username=None, password=None):
    try:
        user = User.objects.get(email=username)
        if user.check_password(password):
            return user
    except User.DoesNotExist:
        return None
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top