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 }}”

 

版权声明:本文为linyuhong原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/linyuhong/p/9493664.html