【问题标题】:ValidationError not showing in template (although field validation errors are)ValidationError 未显示在模板中(尽管字段验证错误是)
【发布时间】:2021-03-30 19:06:17
【问题描述】:

如果在 inlineformset 中发现重复条目​​,我会尝试引发 ValidationError,就像在文档中一样:Custom formset validation 我正在使用调试工具并逐步执行代码。它成功到达行:raise ValidationError("Check Duplicate Entry"),随后,在视图中,它采用 else 语句而不是继续 if formset.is_valid。我 print(formset.non_form_errors) 就像在文档中一样。但是,文档中的示例在此阶段返回一个列表,其中包含错误消息。就我而言,我得到<bound method BaseFormSet.non_form_errors of <django.forms.formsets.MyInlineFormSet object at 0x7fcc22e89610>> 模板与表单数据一起呈现,但验证错误似乎没有说明问题所在。我肯定错过了一些东西。任何帮助表示赞赏。

class MyInlineFormSet(BaseInlineFormSet):

    def __init__(self, *args, **kwargs):
        super(MyInlineFormSet, self).__init__(*args, **kwargs)
        for form in self.forms:
            form.empty_permitted = False

    def clean(self):
        if any(self.errors):
            return
        mylist = []
        for form in self.forms:
            myfield_data = form.cleaned_data.get("myfield")
            if myfield_data in mylist:
                raise ValidationError("Check Duplicate Entry")
            mylist.append(myfield_data)

我的模板就是这样:

{% block content %}
<section class="container-fluid">
    {% crispy form %}
</section>
{% endblock content %}

旁注:针对特定字段的任何字段验证错误都会显示出来。但是我写的错误是这样的: self._errors["fieldname"] = self.error_class(["Error in field, please double check"]) Not sure why raise ValidationError is not working for the formset

【问题讨论】:

  • 请注意,只有当您的表单集中的其余表单中没有其他错误时,您的 clean 方法才会运行。这就是if any(self.errors): return 正在做的事情。您能否确认没有其他错误。
  • 是的,因为我在 VSCode 中使用调试工具,它会逐行执行这些行,因此我可以看到它正在运行哪些行。我可以用视图更新我的代码
  • 所以当您在调试时单步执行时,会引发 ValidationError,但它没有显示在表单上?
  • 是的,你能添加视图吗?那会很有用。
  • 是的,它到达了 raise ValidationError 行,导致它重新呈现表单,但没有显示验证错误。我刚刚看到这似乎是一个类似的问题:stackoverflow.com/questions/19094974/…。该解决方案建议在上下文中发送表单错误,但我使用的是基于分类的视图

标签: django validationerror


【解决方案1】:

已解决!我的表单集是脆的形式中的脆形式。整个表单在链接到视图的模板中呈现。但我应该提到,我有一个单独的模板,其中包含表单集的标记。

   <div class="row justify-content-center">
      <div class="col-7">
       {{ formset.management_form | crispy }}
        {% for form in formset.forms %}
            <h3>Form {{forloop.counter}}</h3>
            {% crispy form %}
        {% endfor %}
       </div>
       <br>
   </div>

所以我只需要在 formset.management_form 下面添加{{ formset.non_form_errors }}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-10
    • 2017-01-15
    • 2017-10-04
    • 2014-04-23
    • 2021-01-01
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    相关资源
    最近更新 更多