clean()方法的简单应用
clean()方法主要用于验证相互依赖的字段,例如注册时,填写的“密码”和“确认密码”要相等时才符合要求。
在调用表单clean() 方法的时候,所有字段的验证方法已经执行完(表单字段的默认验证(如CharField())和特定字段属性的验证(clean_<fieldname>)),所以self.cleaned_data 填充的是目前为止已经合法的数据。所以你需要记住这个事实,你需要验证的字段可能没有通过初试的字段检查。(例如你要验证“密码”和“确认密码”是否相等,但或许它们没有通过初始字段检查,例如格式错误等,但仍会执行这一步)
在这一步,有两种方法报告错误。你可以在clean() 方法中抛出ValidationError 来创建错误。例如:
forms.py
1 from django import forms 2 class RegisterForms(BaseForm, forms.Form): 3 password = forms.CharField() 4 confirm_password = forms.CharField() 5 6 def clean(self): 7 cleaned_data = super(RegisterForms, self).clean() # 注意,super(RegisterForms, self).clean() 的调用时为了保证维持父类中的验证逻辑。 8 v1 = cleaned_data.get('password') 9 v2 = cleaned_data.get('confirm_password') 10 if v1 == v2: 11 pass 12 else: 13 raise ValidationError(message='密码输入不一致', code='invalid') #错误信息保存在errors.__all__中
1 view.py 2 def register(request): 3 if request.method == 'GET': 4 return render(request, 'register.html') 5 6 elif request.method == 'POST': 7 obj = RegisterForms(request=request, data=request.POST) 8 if obj.is_valid(): 9 pass 10 else: 11 error = obj.errors 12 return render(request, 'register.html', {'errors': error, 'obj':obj}) #因为要在HTML中把errors.__all__显示出来,所以要把实例化的obj传过去
register.html
1 <form method='post' action='/register.html'> 2 <div class="form-group"> 3 <label for="password">密码</label> 4 <input type="password" class="form-control" id="password" name="password" placeholder="请输入密码"> 5 <p> 6 {{ errors.password.0 }} 7 {{ obj.non_field_errors.0 }} #显示共有的错误信息 8 </p> 9 </div> 10 11 </form>
第二种方法涉及将错误消息关联到某个字段。在这种情况下,让我们在表单的显示中关联一个错误信息到“password” 。例如:
1 from django import forms 2 3 class RegisterForms(BaseForm, forms.Form): 4 password = forms.CharField() 5 confirm_password = forms.CharField() 6 7 def clean(self): 8 cleaned_data = super(RegisterForms, self).clean() 9 v1 = cleaned_data.get('password') 10 v2 = cleaned_data.get('confirm_password') 11 if v1 == v2: 12 pass 13 else: 14 msg = '密码输入不一致' 15 self.add_error('password', msg)
此时错误信息是关联到password上的,因为不用传递实例化的obj,在register.html上也只需写上”{{ errors.password.0 }}”