添加可识别的非字段错误

Adding iddentifiable non-field errors

我正在 ModelForm 中的 clean 方法中进行一些自定义验证。我想添加自定义非字段错误消息,但我需要它们可以通过某种键来识别,所以这不起作用:

self.add_error(None, 'Custom error message 1')
self.add_error(None, 'Custom error message 2')
self.add_error(None, 'Custom error message 3')

我需要能够区分这些,以便将它们呈现在无效表单模板中的适当位置,而不是将它们全部分组为 None 非字段错误。

我该怎么做?

使用 ValidationError class,它在其初始化程序中支持 code 参数。然后不是获取 non_field_errors() 的字符串,而是获取实际的 data:

self.add_error('__all__', ValidationError("Custom error message", code="type1")
...
for error in self.non_field_errors().data:  # non_field_errors() returns an ErrorList instance
     print(error.code)

我认为在 django 中没有标准的方法可以做到这一点。但是如果你真的想要的话,你可以实现你自己的小方法。

class MyForm(forms.Form):
    def add_non_field_error(self, group, error):
        errors = self._errors.setdefault(group, self.error_class(error_class='nonfield'))
        errors.append(error)


f = MyForm(data={})
f.is_valid()  # True
f.add_non_field_error('no_field', 'This is an error.')
f.is_valid()  # False
f.errors  # {'no_field': ['This is an error.']}