2010-01-24 54 views

回答

3

你无法轻松地在django.contrib.auth.model.User的用户名字段中存储电子邮件,因此您需要一个不同的auth后端。将以下内容添加到AUTHENTICATION_BACKENDS。见http://docs.djangoproject.com/en/dev/topics/auth/#writing-an-authentication-backend

from django.contrib.auth.models import User 

class EmailBackend(object): 
    """ Authenticates against the email field of django.contrib.auth.models.User 
    """ 

    def authenticate(self, email=None, password=None): 
     # Try using the email if it is given 
     if email: 
      for user in User.objects.filter(email=email): 
       if user.check_password(password): 
        return user 

    def get_user(self, user_id): 
     try: 
      return User.objects.get(pk=user_id) 
     except User.DoesNotExist: 
      return None 

然后,在你的意见,通过调用django.contrib.auth.authenticate认证。

有两点需要注意:

  • 你可能会想保持默认AUTHENTICATION_BACKEND那里,特别是如果你想使用Django管理。
  • 如果用户在没有用户名的情况下对自己进行签名,则需要为他们创建一个。我用一个UUID的版本的base64为

的保存方法设置的用户名某处(例如,在您的新用户表单):

import uuid, binascii 
username = binascii.b2a_base64(uuid.uuid4().bytes) 
+0

+1“你不能轻松存储电子邮件”。 User.username字段a)只有30个字符,对于某些电子邮件来说不够长,并且b)它要求名称与'\ w +'匹配,这不允许诸如'@'或'。'之类的内容。如果你只想专注于电子邮件地址,这确实会造成使用者名称(因为它是必需的)的问题。我建议使电子邮件变得流畅(例如[email protected] => foo_bar_com),修剪为30个字符并存储(但要准备处理意外的碰撞)。用户永远不会看到它,并且您的身份验证后端将完全忽略它。 – 2010-01-24 18:20:53

+0

在1.2中,您可以使用电子邮件登录 – yanchenko 2010-03-31 04:00:36

+0

更多内容:1.2现在允许电子邮件中的字符用于用户名(请参阅http://code.djangoproject.com/changeset/12634)。正如提交信息所承认的那样,它不是一个完整的解决方案,因为最大长度仍然只有30个字符。 – 2010-04-01 05:35:52

相关问题