如何在没有HTML标记的情况下提取Django Form错误消息

时间:2017-01-18 03:59:55

标签: 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>

来自此代码的输出

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

    if sale_form.is_valid():
       save_form.save()
    else:
       print save_form.errors

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

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 )

输出结果为:

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

探索的问题和文件

谢谢,请告诉我是否有问题或需要澄清的事情,以便我能解决。

1 个答案:

答案 0 :(得分:3)

绑定表单的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.']}

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

for field, errors in form.errors.items():
   print('Field: {} Errors: {}'.format(field, ','.join(errors))

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

forms reference, under validation

中提到了这一点
  

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