【问题标题】:What are the differences between using self.add_error() and raising a ValidationError()?使用 self.add_error() 和引发 ValidationError() 有什么区别?
【发布时间】:2020-02-19 11:03:53
【问题描述】:

您可以通过 2 种方式引发验证错误。第一个是self.add_error(),第二个是raise ValidationError()

我读到当您使用self.add_error('field1','description here') 时,field1 也会自动从cleaned_data 列表中删除,我假设 ValidationError 对象也添加到self.errors 列表中,这是正确的吗?

但是当您不选择使用self.add_error 而选择使用raise ValidationError 时会发生什么?这个对象是否也在幕后自动添加到errors 列表中?以及如何在正确的无效字段下将此错误消息显示为标题?

谢谢

【问题讨论】:

  • 可能有多个错误。如果您引发验证错误,则该方法的控制流将停止。
  • 你这是什么意思?用户被重定向到错误页面?因为我不希望这种情况发生。我希望返回包含任何值的表单,以及相关字段下的一些错误消息。这只能通过the add_error() 方法完成吗?如果是这样,那么在什么情况下您希望在 errors 列表上使用 ValidationError?
  • 不,引发 ValidationError 会停止该特定方法的流程。因此,如果您在 clean() 中引发 ValidationError,那么您在该方法中编写的任何代码在此之后都不会运行。在这种情况下,您可以考虑add_error()。如果您在clean_<some_field>() 中引发 ValidationError,那么引发 ValidationError 可能是有意义的,因为如果第一次检查已经失败,您可能不想进行其他检查。引发的 ValidationErrors 一起显示在 form.errors 中。

标签: django django-errors


【解决方案1】:

如果您引发错误,该方法的控制流和该方法的调用者将停止,直到有一个方法跨越 try-except 并相应地捕获异常。

但有时一个字段可能包含多个错误。例如,如果您有密码,您可能希望添加错误,因为它太短,不包含数字、小写字母和/或大写字母。

然后您可以使用以下方法实现它:

def clean_password(self):
    pwd = self.cleaned_data['password']
    if len(pwd) < 10:
        self.add_error('password', 'The password is too short.')
    if not any(c.isupper() for c in pwd):
        self.add_error('password', 'The password should contain an uppercase character.')
    if not any(c.islower() for c in pwd):
        self.add_error('password', 'The password should contain an lowercase character.')
    if not any(c.isdigit() for c in pwd):
        self.add_error('password', 'The password should contain an digit.')
    return pwd

如果您要为其中之一提出ValidationError,它不会添加密码可能存在的多个问题。

但是,您可以将错误列表传递给 ValidationError 数据构造函数,因此您可以使用这两个可互换的对象。

【讨论】:

  • 但是使用 add_errors 方法的另一个区别是,您还可以指示哪个字段导致错误(就像您在示例中显示的那样)?或者你可以用ValidationError() 做类似的事情吗?在 django 文档中,我只能看到您可以向 ValidationError 构造函数以及参数添加代码和错误消息。
  • ValidationError() 也可以指定字段:ValidationError(({field:['Message of Error 1',]}), code='error1')
猜你喜欢
  • 2012-07-31
  • 2013-02-05
  • 2010-09-30
  • 2012-01-25
  • 1970-01-01
  • 2011-04-09
  • 1970-01-01
  • 2011-08-19
  • 2013-07-06
相关资源
最近更新 更多