如何在没有 HTML 标签的情况下提取 Django 表单错误消息

and*_*guy 6 django django-forms

我需要提取消息和字段。

例如,我有这个 django 表单错误结果

<ul class="errorlist">
   <li>__all__
     <ul class="errorlist nonfield">
        <li>Pointofsale with this Official receipt and Company already exists.</li>
     </ul>
   </li>
</ul>
Run Code Online (Sandbox Code Playgroud)

从这段代码的输出

def post_sale(request):
    sale_form = request["data"]

    if sale_form.is_valid():
       save_form.save()
    else:
       print save_form.errors
Run Code Online (Sandbox Code Playgroud)

但是我需要实现的是获取没有标签的消息,所以我可以只以纯字符串/文本形式返回这些消息。

def post_sale(request):
    sale_form = request["data"]

    if sale_form.is_valid():
       save_form.save()
    else:
       # This is just pseudo code
       for field in save_form.errors:
           field = str(field["field"})
           message = str(field["error_message"])

           print "Sale Error Detail"
           print field
           print message

           error_message = { 'field':field,'message':message }
           error_messages.append(error_message )
Run Code Online (Sandbox Code Playgroud)

输出将是:

Sale Error Detail
(the field where form error exists)
Pointofsale with this Official receipt and Company already exists.
Run Code Online (Sandbox Code Playgroud)

探索的问题和文档

谢谢,请告诉我是否有问题或需要澄清的地方,以便我可以修复它。

Bur*_*lid 8

errors绑定表单的属性将包含该表单引发的所有错误,作为字典。键是一个字段或其他特殊值(例如__all__),值是一个或多个错误的列表。

这是一个关于它如何工作的简单示例:

>>> from django import forms
>>> class MyForm(forms.Form):
...     name = forms.CharField()
...     email = forms.EmailField()
...     
>>> f = MyForm() # Note, this is an unbound form
>>> f.is_valid()
False
>>> f.errors # No errors
{}
>>> f = MyForm({}) # Now, the form is bound (to an empty dictionary)
>>> f.is_valid()
False
>>> f.errors # dictionary of errors
{'name': [u'This field is required.'], 'email': [u'This field is required.']}
Run Code Online (Sandbox Code Playgroud)

在您看来,根据您的需要,您可以只返回 的值form.errors,或将其解析为您需要的任何结构。

for field, errors in form.errors.items():
   print('Field: {} Errors: {}'.format(field, ','.join(errors))
Run Code Online (Sandbox Code Playgroud)

对于您提到的特定错误,它是由于覆盖该clean()方法而引发的自定义错误- 这就是为什么它列在特殊标识符下__all__而不是在特定字段下。

这在表单参考中提到,在验证下

请注意,您的Form.clean()覆盖引发的任何错误都不会与任何特定字段相关联。它们进入一个特殊的“字段”(称为__all__),non_field_errors()如果需要,您可以通过方法访问它 。如果要将错误附加到表单中的特定字段,则需要调用add_error().