2015-01-14 64 views
1

我已经用电子邮件和其他字段扩展了UserCreationForm,这样我就可以用它的用户名和电子邮件验证用户。使用用户名和电子邮件验证用户

forms.py:

class UserCreationForm(UserCreationForm): 

    class Meta: 
     model = User 
     fields = ('first_name', 'last_name', 'username', 'email',) 

views.py:

def auth_view(request): 
    username = request.POST.get('username','') 
    password = request.POST.get('password','') 
    user = auth.authenticate(username=username, password=password) 

    if user is not None: 
     auth.login(request, user) 
     return HttpResponseRedirect('/') 
    elif: 
     user = auth.authenticate(email=username, password=password) 
     if user is not None: 
      auth.login(request, user) 
      return HttpResponseRedirect('/') 
    else: 
     return HttpResponseRedirect('/accounts/invalid_login') 

HTML:

<form action="/accounts/auth/" method="post"> 
    {%csrf_token%} 

    <label for="name">Email or Username:</label> 
    <input type="text" name="name" id="name" value=""> 
    <label for="password">Password:</label> 
    <input type="password" name="password" id="password" value=""> 

    <input type="submit" value="LOGIN"> 
</form> 

在我试图从给两个usernameemail作为输入的意见形式为name,然后检查用户名和密码是否为aut henticate。如果没有,则检查电子邮件和密码是否通过验证。但它不工作。我该如何解决这个问题?请请帮助我。谢谢。

回答

2

你需要创建一个认证后端:这里是我的:

class EmailAuthBackend(ModelBackend): 
    """ 
    Email Authentication Backend 

    Allows a user to sign in using an email/password pair, then check 
    a username/password pair if email failed 
    """ 

    def authenticate(self, username=None, password=None): 
     """ Authenticate a user based on email address as the user name. """ 
     try: 
      user = User.objects.get(email=username) 
      if user.check_password(password): 
       return user 
     except User.DoesNotExist: 
      try: 
       user = User.objects.get(username=username) 
       if user.check_password(password): 
        return user 
      except User.DoesNotExist: 
       return None 

    def get_user(self, user_id): 
     """ Get a User object from the user_id. """ 
     try: 
      return User.objects.get(pk=user_id) 
     except User.DoesNotExist: 
      return None 

然后在您的设置:

AUTHENTICATION_BACKENDS = ('MyApp.backends.EmailAuthBackend',) 

然后创建一个自定义视图中使用鉴别功能。

+1

请您详细说明一下。我需要在哪里保留'认证'后端? – Kakar

+0

@Kakar你可以在MyApp文件夹中创建backends.py ...!还有其他疑问吗? –

+0

@Raja我是否需要在backends.py中导入任何东西? – Kakar

相关问题