django中form组件的校验时raise ValidationError与self.add_error异同

异同

当我们在form组件用clean函数(无论是局部或者全局钩子函数)验证字段是否有错误时,如果字段正确则最终clean函数要返回该字段值(全局钩子返回self.cleaned_data),是为了放入form对象的cleaned_data字典中,以供后续使用。

出现错误则有两种选择

  1. raise ValidationError('错误信息')

  2. self.add_error('校验字段名','错误信息'),而后返回校验字段值

两种方法都能将字段名及错误信息作为键值对放入对象的errors字典中。

但如果用raise ValidationError 的话后续的cleaned_data字典中将没有该错误字段的键值对。

结论

如过有复合校验的需求,例如先校验手机号是否注册,再校验手机号与验证码是否匹配的时候,若想要两个局部钩子clean函数分开单独检验,最好使用第二种方法,否则如果手机号码出错,后续的是否匹配的钩子函数是无法在cleaned_data中获取手机号的。

当然,你也可以通过调整校验顺序,或直接放在全局钩子中统一校验。

题外话

form组件的校验与drf中的serializer的校验挺像的,clean_变成了validated_,但是drf出错误时raise exceptions.ValidationError(msg, code)会直接返回符合rf规则的响应,不会继续后续的校验。

posted @ 2020-11-05 00:14  lymmurrain  阅读(296)  评论(0编辑  收藏  举报