在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({...})
。这是为什么?
答案 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。