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;今天我要说的是关于验证过程中,产生和收集错误信息的问题。详见上面代码!!!