【问题标题】:Django: Displaying formset errors correctlyDjango:正确显示表单集错误
【发布时间】:2011-01-11 12:03:32
【问题描述】:

我有一个模型的内联表单集,它有一个 unique_together 约束。因此,当我输入不满足此约束的数据时,它会显示:

__all__Please correct the duplicate values below.

执行此操作的代码是:

    {% for error in formset.errors %}
        {{ error }}<br/>
    {% endfor %}

我不太喜欢错误开头的__all__,而且很明显是字典键,所以我尝试了:

    {% for key, error in formset.errors %}
        {{ key }}: {{ error }}<br/>
    {% endfor %}

但我得到的只是:

__all__:

{{ error }} 根本不会显示。那么这里发生了什么?以及如何正确显示错误?

【问题讨论】:

    标签: django django-templates django-forms


    【解决方案1】:

    我认为这里的问题是formset.errors 是一个字典列表,而不是单个字典。

    来自Django docs page on formsets

    >>> formset.errors
    [{}, {'pub_date': [u'This field is required.']}]
    

    看看这样的事情是否能解决问题:(根据提问者 cmets 更新

    {% for dict in formset.errors %}
        {% for error in dict.values %}
            {{ error }}
        {% endfor %}
    {% endfor %}
    

    如果失败,我会尝试使用manage.py shell,并尝试在 python shell 中重现您的情况...这样就可以轻松检查各种值并找出您需要做什么。

    【讨论】:

    • 谢谢 :) 很有帮助。你的方法不起作用,但我终于通过一个小修改(errors.values 而不是错误)让它工作,所以它现在看起来像这样: {% for dict in formset.errors %} {% for error in dict.values %} {{ error }} {% endfor %} {% endfor %}
    • 很高兴我能帮上忙。我已经根据您的 cmets 更新了我的答案。似乎之前搞砸的关键问题是formset.errors 是一个字典列表,而不是一个字典。
    • 对于当前版本的 django,循环遍历模板中的错误通常不是你想要的。由于 OP 在最后询问“......我如何正确显示错误?”,我会参考其他不涉及循环错误的答案。
    【解决方案2】:

    for 循环是不必要的,这些错误应该正确显示如下:

    {{ formset.non_form_errors }}
    

    【讨论】:

    • 这是一个函数而不是属性,因此不会像您预期的那样返回错误
    【解决方案3】:

    以下是针对遇到类似错误未在模板中呈现的问题的任何人的说明:

    如果您对整个表单集有错误,请使用:

    {{ formset.non_form_errors }}
    

    这基本上会返回来自formset.errors__all__ 条目中的错误。它被记录为:

        """
        Returns an ErrorList of errors that aren't associated with a particular
        form -- i.e., from formset.clean(). Returns an empty ErrorList if there
        are none.
        """
    

    但是,如果您从 formset 渲染表单并且某些错误没有被渲染,您可能会丢失:

    {% for form in formset.forms %}
        {# ... #}
        {{ form.non_field_errors }}
    {% endfor %}
    

    这将返回来自form.errors__all__ 条目中的错误。类似于non_form_errors,这些错误与特定字段无关,而是与字段关系相关。例如,如果您有一个包含字段FromTo 的表单,并且您验证From 的值是否小于To 的值,则标签{{ form.non_field_errors }} 可能会呈现以下错误:

    'The From value must be smaller than the To value'
    

    【讨论】:

    • 如果您想自己设置 formset.non_form_errors 值,请使用以下语法 formset._non_form_errors = "my error message"(注意 non_form_errors 前面的下划线)
    【解决方案4】:

    Django 1.6 表单集有一个新方法,BaseFormSet.total_error_count。在模板条件中使用它可以确保只有在表单集中至少存在一个错误时才会输出错误和标记。

    {% if formset.total_error_count %}
        <ul class="errorList">
        {% for dict in formset.errors %}
            {% for error in dict.values %}
            <li>{{ error }}</li>
            {% endfor %}
        {% endfor %}
        </ul>
    {% endif %}
    

    请参阅Django docs page 了解 v1.6+。

    【讨论】:

      猜你喜欢
      • 2016-01-28
      • 1970-01-01
      • 1970-01-01
      • 2020-07-09
      • 2019-10-29
      • 2016-07-12
      • 1970-01-01
      • 1970-01-01
      • 2014-08-24
      相关资源
      最近更新 更多