2015-10-06 49 views
1

LoginForm的在forms.py用户匹配查询不鉴于存在登录表单

class LoginForm(forms.Form): 
    username = forms.CharField(label='Username', max_length=30) 
    password = forms.CharField(
     label='Password', 
     widget = forms.PasswordInput(), 
    ) 

    def clean_username(self): 
     username = self.cleaned_data['username'] 

     try: 
      User.objects.get(username = username) 
      user.objects.get(username = username) 
     except ObjectDoesNotExist: 
      raise forms.ValidationError('Invalid Username or Password!') 

    def clean_password(self): 
     password1 = self.cleaned_data['password'] 
     username = self.cleaned_data['username'] 
     user = User.objects.get(username = username) 
     password2 = user.password 

     if user.check_password(password1): 
      return password1 
     else: 
      raise forms.ValidationError('Invalid Username or Password!') 

login_page在views.py

def login_page(request): 
    template = get_template('login_page.html') 
    if request.method == 'POST': 
     form = LoginForm(request.POST) 
     if form.is_valid(): 
      username = form.cleaned_data['username'] 
      password = form.cleaned_data['password'] 
      user = authenticate(username=username, password=password) 
      if user is not None: 
       login(request, user) 
       return HttpResponseRedirect('/user/username') 

    else: 
     form = LoginForm() 

    variables = RequestContext(request, { 
      'form': form 
     }) 
    return render_to_response('login_page.html', variables) 

login_page.html模板

{% extends "base.html" %} 
{% block title %}User Login{% endblock %} 
{% block head %}User Login{% endblock %} 
{% block content %} 
{% if form.has_errors %} 
    <p>Your username and password didn't match. 
     Please try again.</p> 
{% endif %} 
<form method="post" action="."> 
<p><label for="id_username">Username:</label> 
{{ form.username }}</p> 
<p><label for="id_password">Password:</label> 
{{ form.password }}</p> 
<input type="submit" value="login" /> 
<input type="hidden" name="next" value="/" /> 
</form> 
{% endblock %} 

上面的视图当从调用localhost:8000/login/产生一个用户匹配查询不存在错误。我无法准确感觉到原因。我正在使用Django 1.8使用的默认身份验证系统。

我是Django的新手。请帮助我。

+1

请注意,您不必编写自己的登录表单和视图。 Django内置['login'](https://docs.djangoproject.com/en/1.8/topics/auth/default/#django.contrib.auth.views.login)视图,它使用内置的['' AuthenticationForm'](https://docs.djangoproject.com/en/1.8/topics/auth/default/#module-django.contrib.auth.forms)。 – Alasdair

+0

不,你**不能**自己做这个。这是非常不安全的。 **不要**。 –

+0

是的。阅读并更改它。谢谢:D –

回答

0

这个例外来自:

user = User.objects.get(username = username) 

clean_password。您已经知道如何解决这个错误,您已通过try,except来避免此错误,在clean_username中完成了该查询。

+0

非常感谢。完美的作品:) –