2010-01-31 100 views
16

我有一个模型的内联表单,它具有unique_together约束。所以,当我输入数据,不符合这个约束,它会显示:Django:正确显示表单错误

__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__:

{{错误}}不会显示在所有。那么这里发生了什么?如何正确显示错误?

回答

24

我认为这里的问题是,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中重现你的情况......这样就可以轻松检查各种值并找出你需要做的事情。

+0

谢谢:)有用。你的方式没有奏效,但我终于通过一个小的修改(errors.values而不是错误)来工作,所以它现在看起来像这样: {%for formset.errors%中的字典% {%for错误在dict.values%} {{error}} {%endfor%} {%endfor%} – 2010-01-31 22:00:25

+0

很高兴我能帮上忙。我根据您的意见更新了我的答案。似乎之前搞错的关键问题是'formset.errors'是一个字典列表,而不是一个字典。 – 2010-01-31 22:20:32

+0

对于当前版本的django,循环模板中的错误通常不是您想要的。由于OP在最后问到“......我如何正确显示错误?”,我会参考其他不涉及循环错误的答案。 – dsalaj 2016-10-31 08:50:17

5

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

{{ formset.non_form_errors }} 
2

Django的1.6表单集有一个新的方法,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 +。

0

这里是澄清的人遇到错误的类似问题在模板中不被渲染:

{{ formset.non_form_errors }} 

这主要会返回错误:

如果你已经和有关表单集为一体,使用错误__all__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. 
    """ 

然而,如果你从渲染的formset的形式和一些错误不被renderd,你可能丢失:

{% 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' 
+0

如果您想自己设置formset.non_form_errors值,请使用以下语法'formset._non_form_errors =“我的错误消息”'(注意non_form_errors之前的下划线) – Ben 2017-09-26 22:01:57