使用 self.add_error() 和引发 ValidationError() 之间有什么区别?

What are the differences between using self.add_error() and raising a ValidationError()?

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

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

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

谢谢

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

但有时一个字段可能包含 多个 错误。例如,如果您有密码,您可能想要添加错误,因为它太短,不包含数字,小写,and/or 大写。

然后你可以这样实现:

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 数据构造函数,因此您可以使用这两个可互换的。