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__:
{{error}} вообще не отображается. Так что происходит здесь? И как правильно отобразить ошибку?
Ответы
Ответ 1
Я думаю, проблема в том, что formset.errors
- это список словарей, а не один словарь.
На странице Django docs на наборах форм:
>>> 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... таким образом, будет легко проверить различные значения и выяснить, что вам нужно сделать.
Ответ 2
Для циклов for нет необходимости, эти ошибки должны быть правильно отображены со следующим:
{{ formset.non_form_errors }}
Ответ 3
Django 1.6 formsets имеют новый метод 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 для v1.6 +.
Ответ 4
Вот пояснение для тех, кто сталкивается с подобными проблемами ошибок, которые не отображаются в шаблоне:
Если у вас есть и ошибка в отношении набора форм в целом, используйте:
{{ 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.
"""
Однако, если вы обрабатываете формы из набора форм, а некоторые ошибки не являются renderd, вы, вероятно, не видите:
{% for form in formset.forms %}
{# ... #}
{{ form.non_field_errors }}
{% endfor %}
это возвращает ошибки в записи __all__
из form.errors
. Они аналогичны ошибкам non_form_errors
, которые не связаны с конкретным полем, а скорее с полевыми отношениями. Например, если у вас была форма с полями From
и To
, и вы подтверждаете, что значение From
меньше, чем значение To
, тег {{ form.non_field_errors }}
может отобразить следующую ошибку:
'The From value must be smaller than the To value'