Django ValidationError - 如何正确使用它?

时间:2013-11-25 16:24:48

标签: django django-forms

目前正在进行的代码(来自表单):

# the exception that gets raised if the form is not valid
raise forms.ValidationError("there was an error");

# here is where form.is_valid is called
form.is_valid() == False: 

    response['msg']=str(form.errors)
    response['err']='row not updated.'
    json = simplejson.dumps( response )  #this json will get returned from the view.

这个问题在于,它正在向客户端发送错误消息:

  • __ all __
    • “出现错误。”
  • 我想从返回的错误模板中删除“所有”垃圾。我该怎么做呢?似乎在django表单代码中加入了深层次。

    2 个答案:

    答案 0 :(得分:2)

    这是因为错误与任何字段都没有特别关联,但它就是所谓的非字段错误。

    如果您只对非字段错误感兴趣,只需将其传递给响应:

    response['msg']=str(form.errors['__all__'])
    

    答案 1 :(得分:1)

    errorsdict的子类的实例,带有一些特殊的渲染代码。大部分键都是表单的字段,但正如文档所述,在ValidationError中引发clean会产生一条与任何特定字段无关的错误消息:

      

    请注意,Form.clean()覆盖引发的任何错误都不会与任何字段相关联。他们进入一个特殊的“字段”(称为__all__),如果需要,可以通过non_field_errors()方法访问该字段。如果要将错误附加到表单中的特定字段,则需要访问表单上的_errors属性,稍后将对此进行描述。

    https://docs.djangoproject.com/en/dev/ref/forms/validation/

    因此,您可以以不同方式生成错误的字符串表示形式(可能从form.errors.values()form.errors.itervalues()开始,也可能使用默认as_text类的ErrorList方法)或将您的错误与文档中描述的表单的特定字段相关联:

      

    如果确实需要将错误附加到特定字段,则应在Form._errors属性中存储(或修改)密钥。此属性是django.forms.utils.ErrorDict类的实例。但基本上,它只是一本字典。在字典中有一个键,表单中的每个字段都有错误。字典中的每个值都是一个django.forms.utils.ErrorList实例,它是一个知道如何以不同方式显示自身的列表。因此,您可以将_errors视为将字段名称映射到列表的字典。

         

    如果要向特定字段添加新错误,则应检查密钥是否已存在于self._errors中。如果没有,则为给定键创建一个新条目,并保存一个空的ErrorList实例。在任何一种情况下,您都可以将错误消息附加到相关字段名称的列表中,并在显示表单时显示。

    https://docs.djangoproject.com/en/dev/ref/forms/validation/#form-subclasses-and-modifying-field-errors