我有一个模型的内联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}}根本不会显示。那么这里发生了什么?如何正确显示错误?
答案 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.errors
和non_form_errors
,并且验证From
值是否小于To
值,则标记From
可以呈现以下错误:
To