我需要在full_clean
中进行一些跨领域验证时,我已经在save
调用clean
很长一段时间了:
class SomeModel(models.Model):
a_field = models.TextField()
another_field = models.TextField()
def clean(self):
if 'condition one' in self.another_field:
if 'condition two' in self.a_field:
raise ValidationError('oops', code='condition_one_two_err')
def save(self, *args, **kwargs):
self.full_clean()
super(SomeModel, self).save(*args, **kwargs)
我今天注意到这会导致ValidationError上的code
kwarg被吞噬。
这是因为在Django的full_clean
method中我的ValidationError
被捕获,然后方法raises its own instance没有传递代码属性。
这是一个错误还是预期的行为?
答案 0 :(得分:1)
我的猜测是它的预期行为,因为full_clean
引发的实例可能收集了多个ValidationError
实例,而这些实例是在清理少数字段时引发的。错误详细信息将合并到一个实例中,因此当您提交表单时,您会立即看到所有错误,而不必重新提交数据并逐个更正表单错误。
现在,ValidationError
类只有一个代码属性,那么如果清理过程中的多个错误都提到了不同的代码,它应该怎么做?
答案 1 :(得分:0)
这是djnago Model的清洁方法源代码的一部分:
try:
self.clean()
except ValidationError as e:
errors = e.update_error_dict(errors)
if errors:
raise ValidationError(errors)
你是对的Django“吃”你的代码。我相信你应该只在对象保存上调用self.clean()
方法。为什么?您无需验证实例数据的唯一性,也没有为您的字段分配任何其他验证器。