Form组件中关于对字段认证[clean,clean_字段]的补充(关于错误信息)
class RegesterForm(Form):
username = fields.CharField(
widget=widgets.TextInput(
attrs={"class": "form-control",
"placeholder": "用户名",
}),
error_messages={
"required": "内容不能为空",
"invalid": "格式错误,请重新输入!", })
nickname = fields.CharField(
widget=widgets.TextInput(
attrs={"class": "form-control",
"placeholder": "即昵称",
}),
error_messages={
"required": "内容不能为空",
"invalid": "格式错误,请重新输入!", })
email = fields.EmailField(
widget=widgets.TextInput(
attrs={
"class": "form-control",
"placeholder": "请输入您查用邮箱",
}),
error_messages = {
"required": "内容不能为空",
"invalid": "格式错误,请重新输入!",}
)
password = fields.CharField(
widget=widgets.PasswordInput(
attrs={"class": "form-control",
"placeholder": "密码,必须包含数字,字母!",
}),
error_messages={
"required": "内容不能为空",
"invalid": "格式错误,请重新输入!", })
passwords = fields.CharField(
widget=widgets.PasswordInput(
attrs={"class": "form-control",
"placeholder": "请输入确认密码",
}),
error_messages={
"required": "内容不能为空",
"invalid": "格式错误,请重新输入!", })
avatar = fields.FileField(
widget=widgets.FileInput(
attrs={'id':"imgSelect",}),
)
code = fields.CharField(
widget=widgets.TextInput(
attrs={
"class": "form-control",
"placeholder": "验证码",
},)
)
def __init__(self,request,*args,**kwargs):
super(RegesterForm,self).__init__(*args,**kwargs)
self.request = request
def clean_code(self):
input_code = self.cleaned_data["code"]
session_code = self.request.session.get("code")
if input_code.upper() == session_code.upper():
return input_code
raise ValidationError("验证码错误,请重新输入!")
#自定义字段验证方法,获取错误信息的方式不变,还是 对象.errors.字段名.0
def clean(self):
p1 = self.cleaned_data.get("password")
p2 = self.cleaned_data.get("passwords")
if p1 == p2:
return self.cleaned_data
else:
self.add_error("passwords",ValidationError("输入的密码不一致!"))
对于Form组件的错误信息:
注意再注意:
默认错误信息方式: raise ValidationError("输入的密码不一致!")
自定义对已拿到所有字段数据进行验证的时候,这种方式在获取错误信息时就发生改变,查看源码发现如果有错误的话,他会执行self.add_error(None, e)
通过方法给字段None添加错误信息,查看add_error的源码以及执行过程,发现None = NON_FIELD_ERRORS。也就是说会默认给__all__字段或
NON_FIELD_ERRORS写上错误信息。原因:内部定义的NON_FIELD_ERRORS="__all__",
获取方式:
前端获取 是通过obj.non_field_errors
后台获取是通过 obj.errors["__all__"] or obj.errors[NON_FIELD_ERRORS]
我们知道,当报错的时候,内部会自动去添加错误信息,若是我们能否手动指定某个字段呢?答案是肯定的。
这样我们自己添加异常的错误信息,就能直接通过{{obj.errors.passwords.0}}获取到与其他的无疑。
语法:
self.add_error('字段名称', 错误异常对象)
以上代码是我写用户注册时的form组件,由于牵扯到对输入字段的认证问题!如果选择在视图函数中,那代码的重复率可就老了去了!!!所以就使用了Form组件中的字段认证的方法!!!
前面已经介绍过Form组件中两种验证方式的函数,一个对字段的 clean_字段;另一个是等所有字段验证之后,对所有验证过的clean_data进行更高的验证:clean;今天我要说的是关于验证过程中,产生和收集错误信息的问题。详见上面代码!!!
浙公网安备 33010602011771号