Django的full_clean将代码kwarg吞噬到ValidationError。该怎么办?

时间:2016-09-22 18:33:53

标签: django

我需要在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没有传递代码属性。

这是一个错误还是预期的行为?

2 个答案:

答案 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()方法。为什么?您无需验证实例数据的唯一性,也没有为您的字段分配任何其他验证器。