2016-04-21 41 views
0

这里Django表单验证错误的形式无法显示同一页

class LoginForm(forms.Form): 
    email = forms.EmailField(
     label=("Email"), 
     widget=forms.TextInput(attrs={ 
      'id': 'inputEmail', 
      'class': 'form-control inp', 
      'type': 'text', 
      'placeholder': 'your email' 
     }), 
     required=True 
    ) 
    password = forms.CharField(
     widget=forms.PasswordInput(
      render_value=False, 
      attrs={ 
       'id': 'inputPassword', 
       'class': 'form-control inp', 
       'type': 'password', 
       'placeholder': 'Password' 
      } 
     ), 
     required=True 
    ) 

这里是表单

class Home(View): 
    template_name = "sellers/seller_home.html" 
    form_class = LoginForm 


    def get(self, request , *args , **kwargs): 
     context = {} 

     login_form = LoginForm() 

     context['login_form'] = login_form 

     return render(request , "sellers/seller_home.html" , context) 

    def post(self , request , *args , **kwargs): 
     email = request.POST.get('email') 
     name = request.POST.get('store_name') 
     password = request.POST.get('password') 
     mobile = request.POST.get('mobile') 

     form = self.form_class(request.POST) 


     if request.is_ajax(): 
      if email: 
       if User.objects.filter(email=email).exists(): 
        return HttpResponse(json.dumps('True')) 
       else: 
        return HttpResponse(json.dumps('False')) 
      if mobile: 
       if User.objects.filter(mobile=mobile).exists(): 
        return HttpResponse(json.dumps('True')) 
       else: 
        return HttpResponse(json.dumps('False')) 
     else: 
      if form.is_valid(): 
       email = form.cleaned_data["email"] 
       password = form.cleaned_data["password"] 

       user = User.objects.get(email__iexact=email) 

       authenticated_user = authenticate(username=user.username , password=password) 

       if not authenticated_user: 
        raise ValidationError("Email or password is incorrect") 
       else: 
        login(request , authenticated_user) 
        return HttpResponseRedirect(reverse('dashboard')) 
      else: 
       return render(request , self.template_name , {'login_form' : form}) 

这里的问题IAM面临的看法是,我不能够将验证错误显示为模板中的标签。它将错误作为验证错误抛出。如何以更好的方式实现验证?

这里是回溯

Traceback: 
File "C:\Python27\lib\site-packages\django\core\handlers\base.py" in get_response 
    132.      response = wrapped_callback(request, *callback_args, **callback_kwargs) 
File "C:\Python27\lib\site-packages\django\views\generic\base.py" in view 
    71.    return self.dispatch(request, *args, **kwargs) 
File "C:\Python27\lib\site-packages\django\views\generic\base.py" in dispatch 
    89.   return handler(request, *args, **kwargs) 
File "C:\Users\lenovo\Desktop\Grooved2\grooved\src\sellers\views.py" in post 
    82.     raise ValidationError("Email or password is incorrect") 

Exception Type: ValidationError at /sellers/ 
Exception Value: [u'Email or password is incorrect'] 

回答

3

Django的观点不处理验证错误。您应该在表单的clean_<field>clean方法中提出ValidationError

请注意,Django已经有一个内置的AuthenticationForm,你可以使用。如果你看看它的源代码,你可以看到它在窗体的clean方法中如何调用authenticate,而不是在视图中。

1

你是使用内置的身份验证方法:

authenticated_user = authenticate(username=user.username , password=password) 因此没有必要提高ValidationError

Django的意见并不处理它。您应该使用干净的方法来验证字段。