Django:正确显示formset错误

时间:2010-01-31 20:15:24

标签: django django-templates django-forms

我有一个模型的内联formset,它有一个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}}根本不会显示。那么这里发生了什么?如何正确显示错误?

4 个答案:

答案 0 :(得分:29)

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

来自Django docs page on formsets

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

看看这样的事情是否解决了这个问题:(根据参议员的评论进行了更新

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

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

答案 1 :(得分:9)

for循环是不必要的,应该使用以下内容正确显示这些错误:

{{ formset.non_form_errors }}

答案 2 :(得分:2)

Django 1.6 formsets有一个新方法BaseFormSet.total_error_count。在模板条件中使用此选项可确保只有在formset中至少存在一个错误时才会输出错误和标记。

{% 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 +。

答案 3 :(得分:2)

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

如果您对整个formset有错误,请使用:

        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">

        <nav class="navbar navbar-default" role="navigation">
          <div class="navbar-header">
            <a class="navbar-brand" href="#">Brand</a>
            <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
              <span class="icon-bar"></span>
              <span class="icon-bar"></span>
              <span class="icon-bar"></span>
            </button>    
          </div>
          <div class="navbar-collapse collapse">
            <ul class="nav navbar-nav navbar-left">
                <li><a href="#">Left</a></li>
                <li><a href="#about">Left</a></li>
            </ul>
            <ul class="nav navbar-nav navbar-right">
              <li><a href="#about">Right</a></li>
              <li><a href="#contact">Right</a></li>
            </ul>
          </div>
        </nav>

    <style>
    .navbar-header {
    float: none;
    text-align:center;
    }
    .navbar-brand {
display: inline-block;
float: none;
}
.navbar-collapse {
display: inline-block !important;
text-align:center;
width: 100%;
}
.navbar-nav.navbar-left, .navbar-nav.navbar-right {
float:none !important;
display:inline-block;
}
    </style>

这基本上会返回来自{{ formset.non_form_errors }} 的{​​{1}}条目中的错误。它记录为:

__all__

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

formset.errors

这将返回 """ 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. """ {% for form in formset.forms %} {# ... #} {{ form.non_field_errors }} {% endfor %} 条目中的错误。这些与__all__类似,不是与特定字段相关联的错误,而是与字段关系相关联的错误。例如,如果您的表单包含字段form.errorsnon_form_errors,并且验证From值是否小于To值,则标记From可以呈现以下错误:

To