django中form组件的校验时raise ValidationError与self.add_error异同
异同
当我们在form组件用clean函数(无论是局部或者全局钩子函数)验证字段是否有错误时,如果字段正确则最终clean函数要返回该字段值(全局钩子返回self.cleaned_data),是为了放入form对象的cleaned_data字典中,以供后续使用。
出现错误则有两种选择
-
raise ValidationError('错误信息')
-
self.add_error('校验字段名','错误信息'),而后返回校验字段值
两种方法都能将字段名及错误信息作为键值对放入对象的errors字典中。
但如果用raise ValidationError 的话后续的cleaned_data字典中将没有该错误字段的键值对。
结论
如过有复合校验的需求,例如先校验手机号是否注册,再校验手机号与验证码是否匹配的时候,若想要两个局部钩子clean函数分开单独检验,最好使用第二种方法,否则如果手机号码出错,后续的是否匹配的钩子函数是无法在cleaned_data中获取手机号的。
当然,你也可以通过调整校验顺序,或直接放在全局钩子中统一校验。
题外话
form组件的校验与drf中的serializer的校验挺像的,clean_变成了validated_,但是drf出错误时raise exceptions.ValidationError(msg, code)
会直接返回符合rf规则的响应,不会继续后续的校验。