Подтвердить что ты не робот

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}} вообще не отображается. Так что происходит здесь? И как правильно отобразить ошибку?

4b9b3361

Ответ 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'