2010-01-31 101 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