如何在django中将错误消息附加到form.non_field_errors?

时间:2011-12-22 00:52:52

标签: python django django-forms

我有一个包含多个字段的表单。我通过表单验证对每个字段进行单独的验证检查。但是,在将用户重定向到不同视图之前,我还需要检查是否填写了少量字段。我希望我能以某种方式将错误附加到forms.non_field_errors,因为它不适用于特定字段,但我不确定这是什么正确的语法。我在网上查了一下,发现..

form.errors['__all__'] = form.error_class(["error msg"])

这会显示错误消息,但它似乎也会弄乱其他页面,如果我点击其他任何内容,则会显示错误消息。

我试过

form._errors[NON_FIELD_ERRORS] = form.error_class()

这导致'NoneType'对象没有属性'setdefault'错误。

我试过了

form.non_field_errors().append("Please complete your profile in order to access the content.")

这似乎没有做任何事情,我无法在视图上看到错误消息。

最好的方法是什么?理想情况下,我不想在表单的干净方法中这样做。我觉得我应该能够在视图中向表单添加错误。

3 个答案:

答案 0 :(得分:17)

  1. 调用full_clean(),这应该初始化form._errors。这一步至关重要,如果你不这样做,它就行不通了。

  2. 制作错误列表,它会显示一条消息列表,并将其设置为:error_list = form.error_class(['your error messages'])

  3. 将错误列表分配给NON_FIELD_ERRORS ,您必须从NON_FIELD_ERRORS导入django.forms.forms,然后分配:form._errors[NON_FIELD_ERRORS] = error_list

  4. 以下是来自shell的演示:

    In [1]: from bet.forms import BetForm
    
    In [2]: from django.forms.forms import NON_FIELD_ERRORS
    
    In [3]: form = BetForm()
    
    In [4]: form.full_clean()
    
    In [5]: form._errors[NON_FIELD_ERRORS] = form.error_class(['your error messages'])
    
    In [6]: form.non_field_errors()
    Out[6]: [u'your error messages']
    

答案 1 :(得分:4)

这有点过时,但我最近遇到了同样的问题,并希望为未来的读者提供更多的信息。

  1. 从Django 1.6+开始,错误字典存储为form.errors而不是form._errors
  2. 如果实例化form.is_valid(),则相当于运行full_clean()
  3. NON_FIELD_ERRORS不需要导入,您可以简单地引用其__all__的默认字典键
  4. 示例:

    if form.is_valid():
        form.errors['__all__'] = form.error_class(['Your Error Here!'])
    

答案 2 :(得分:0)

self._errors.setdefault('__all__', ErrorList()).extend([""])