Django: правильное отображение ошибок формы - PullRequest
20 голосов
/ 31 января 2010

У меня есть встроенный набор форм для модели, которая имеет ограничение 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 ]

30 голосов
/ 31 января 2010

Мне кажется, проблема в том, что 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 ... таким образом, вам будет легко проверить различные значения и выяснить, что вам нужно сделать.

9 голосов
/ 09 октября 2013

Циклы for не нужны, эти ошибки должны корректно отображаться следующим образом:

{{ formset.non_form_errors }}
2 голосов
/ 31 октября 2016

Вот разъяснение для тех, кто сталкивается с похожими проблемами ошибок, не отображаемых в шаблоне:

Если у вас есть ошибка в отношении набора форм в целом, используйте:

{{ 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.
    """

Однако, если вы визуализируете формы из набора форм, а некоторые ошибки не отображаются, вы, вероятно, пропустите:

{% 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'
2 голосов
/ 23 октября 2013

В наборах форм Django 1.6 появился новый метод, 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 +.

...