【问题标题】:How to properly throw a ValidationError in Django?如何在 Django 中正确抛出 ValidationError?
【发布时间】:2017-08-24 19:06:09
【问题描述】:

在 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!")

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

【问题讨论】:

    标签: python django


    【解决方案1】:

    在继承自 BaseFormSet 的任何类中,clean 实例方法中引发的 ValidationErrors 不与任何特定表单相关联。

    根据设计,您可以将列表传递给 ValidationErrorclean 中的字符串以用于 InlineFormSet。这将确保self.error_list is set.这对 formset 很有意义,因为它包含一个表单列表。

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

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

    参考文献

    【讨论】:

      猜你喜欢
      • 2018-04-15
      • 2019-01-12
      • 2022-01-07
      • 1970-01-01
      • 2017-10-18
      • 2022-01-22
      • 2016-02-24
      • 2019-01-03
      • 1970-01-01
      相关资源
      最近更新 更多