如何在Django中正确抛出ValidationError?

时间:2017-08-24 19:06:10

标签: python django

在Django表单中抛出ValidationError异常的适当方法是什么?

似乎有一些不同的互斥方式来抛出这个异常。如果我在表单中有自定义clean()方法,并且错误没有引用任何特定字段,那么我必须抛出它:

raise ValidationError({NON_FIELD_ERRORS: ["Something's wrong!"]})

但是,如果我在InlineFormSet的自定义clean()方法中执行此操作,它会破坏Django的验证框架并抛出错误:

AttributeError: 'ValidationError' object has no attribute 'error_list'

如果我改为将代码更改为:

raise ValidationError("Something's wrong!")

然后它工作正常,我在我的网页上看到一个用户友好的红色验证错误。但是,此语法几乎在其他任何地方都失败,如果我使用'ValidationError' object has no attribute 'error_list'语法,则会引起错误raise ValidationError({...})。这是为什么?

1 个答案:

答案 0 :(得分:2)

在从BaseFormSet继承的任何类中,ValidationError实例方法中引发的clean都不与任何特定形式相关联。

按照设计,您可以将列表传递给ValidationError或将clean中的字符串传递给InlineFormSet。这将确保self.error_list is set。这对于formset是有意义的,因为它包含一个表单列表。

raise ValidationError([{NON_FIELD_ERRORS: ["Something's wrong!"]}])

ValidationError引发的Form不同,其中引发的错误与该表单相关联。因此,表单支持将dict, str or list传递给ValidationError。

参考