Django:更改/允许用户的登录用户名也使用他/她的电子邮件

时间:2010-11-24 14:03:24

标签: django django-users django-login

正如我的标题所说,我想知道我是否有办法让用户不仅可以使用他的用户名,还可以使用用户的电子邮件登录。我想标准化登录过程,因为目前我的用户使用了许多不同的约定,而且它变得非常混乱。

2 个答案:

答案 0 :(得分:2)

如果您强制使用唯一的电子邮件地址,则可以执行此操作。意味着没有用户可以拥有相同的电子邮件地址。这样您就可以通过电子邮件地址获取用户并将其登录。

表单可能如下所示:

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

view方法可能如下所示:

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可能是另一种方式:http://bit.ly/a2OlHX

确保每位用户使用唯一的电子邮件地址:http://bit.ly/aOaAbw

答案 1 :(得分:0)

我认为我现在解决了我的问题,至少它已经解决了。 我决定使用自己的身份验证后端。我创建了一个文件'auth_backends.py'并将其添加到我的settings.py中的AUTHENTICATION_BACKENDS:

我的登录表单字段仅包含“用户名”和密码。我正在做的唯一方法是检查输入的用户名是否实际上是他的用户名或电子邮件,是通过.find('@')。 有没有更好的方法来检查它?这够了吗? 我这样做的全部原因是因为用户更容易记住他/她的电子邮件而不是用户名(实际上是由数字组成的'id')。

我还需要处理重复的电子邮件。

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