2012-08-13 26 views
0

我在Django中使用UserModel和UserCreationForm。但是,我不想使用用户名,而是想使用客户的电子邮件作为登录信息(即完全绕过/忽略用户名字段)。如何将客户的电子邮件作为Django的UserCreationForm/User Model中的用户名?

  1. 我怎么去让用户名字段是在用户模型
  2. 如何打开电子邮件到客户的“用户名”可选?反过来,我如何使这个电子邮件领域被要求呢?
+0

可能重复Django](http://stackoverflow.com/questions/778382/accepting-email-address-as-username-in-django) – 2012-08-13 17:19:11

回答

1

1.)只需在您的表单中输入用户名字段,然后在电子邮件中删除'@'后,将模型作为用户名传递。

2)创建一个自定义的认证后端(这将接受用户名或电子邮件):

from django.contrib.auth.models import User 

class EmailOrUsernameModelBackend(object): 
    def authenticate(self, username=None, password=None): 
     if '@' in username: 
      kwargs = {'email': username} 
     else: 
      kwargs = {'username': username} 
     try: 
      user = User.objects.get(**kwargs) 
      if user.check_password(password): 
       return user 
     except User.DoesNotExist: 
      return None 

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

CHAGE您进行相应的设置:在[接受电子邮件地址作为用户名的

AUTHENTICATION_BACKENDS = (
    'myoursite.backends.EmailOrUsernameBackend', # Custom Authentication to accept usernamee or email 
) 
+0

很酷,谢谢!我只是从你的帖子中得到了另一个想法。而不是输入用户名,我怎样才能得到它,以便电子邮件中@符号之前的所有内容(例如:[email protected]中的goelv)变成用户名?这是我在视图中处理的事情吗?我是新手,感谢您的帮助! – goelv 2012-08-13 17:29:02

+0

那么,这不是很现实....如果两个用户有电子邮件地址[email protected]和[email protected],他们不能有相同的用户名 – 2012-08-13 17:33:38

+0

我正在一个系统的第一部分将是独一无二的,所以它可能是可行的 – goelv 2012-08-13 17:37:17

相关问题