如何检测表单集在模板中是不是有任何错误?

Posted

技术标签:

【中文标题】如何检测表单集在模板中是不是有任何错误?【英文标题】:How do I detect if a formset has any errors at all in a template?如何检测表单集在模板中是否有任何错误? 【发布时间】:2011-03-20 16:48:22 【问题描述】:

感谢 django 中出色的内联模型表单集,我有一个非常高级的表单,其中包含 4 个内联表单集。在模板中,我在选项卡中显示每个表单集。一切都很顺利,但如果该选项卡中的表单集有任何验证错误,我想将选项卡涂成红色。所以我尝试了这个:

<div id="tabs">
    <ul>
        <li><a href="#foo-tab"% if forms.FooFormSet.errors % class="error"% endif %>Foo</a></li>
        <li><a href="#bar-tab"% if forms.BarFormSet.errors % class="error"% endif %>Bar</a></li>
        <li><a href="#zoo-tab"% if forms.ZooFormSet.errors % class="error"% endif %>Zoo</a></li>
        <li><a href="#doo-tab"% if forms.DooFormSet.errors % class="error"% endif %>Doo</a></li>
    </ul>

    <div id="foo-tab"></div>
    <div id="bar-tab"></div>
    <div id="zoo-tab"></div>
    <div id="doo-tab"></div>
</div>

但它不起作用,因为 forms.*Set.errors 是一个带有空字典的列表(因此它总是会返回 True),例如 [, , ] (表单集中的表单数量是相同的formset.errors 中的空字典数量

我认为一种解决方案可能是将 BaseInlineFormSet 子类化并添加一个 has_errors 方法或其他方法,然后将该子类基用于我的所有表单集。还有其他建议吗?谢谢!

【问题讨论】:

【参考方案1】:

您可以检查表单集方法is_valid 的结果,该方法依次检查每个表单的有效性:% if forms.FooFormSet.is_valid %

据我所知,如果表单已经过验证,则或多或少是无操作(不触及数据库,不重新验证表单),因此根本不会损害性能。

【讨论】:

谢谢!这种工作,如果表单尚未发布,它 is_valid 将返回 false 但我可以通过分配 is_post: True 与上下文或其他东西来解决这个问题 @Andreas:嗯,好点,我当然没有想到那个。但是,您可以进行not is_bound or is_valid 类型的检查。 is_boundFalse 如果表单集/表单在没有任何数据的情况下被初始化(initial 不计算在内), - 正是您所说的“表单尚未发布”。【参考方案2】:

最好使用total_error_count函数 https://docs.djangoproject.com/en/2.0/topics/forms/formsets/#django.forms.formsets.BaseFormSet.total_error_count

【讨论】:

以上是关于如何检测表单集在模板中是不是有任何错误?的主要内容,如果未能解决你的问题,请参考以下文章

查询集在 shell 中工作,但不在表单中

django如何访问错误消息列表中的第一个错误

Flask 视图显示 400 错误而不是带有表单的模板

如果仅在模板中立即给出错误输入,如何在 Django 模板中显示表单错误?

django 表单错误。得到没有任何 html 标签的错误

如何在 Django 中列出所有与表单相关的错误?