Отображение сообщений об ошибках сообщений Django

Я использовал Django Messaging Framework для отображения сообщений пользователю в шаблоне.

Я выводил их в шаблон следующим образом:

<ul>
    {% for message in messages %}
        <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
    {% endfor %}
</ul>

Это выводит все сообщения, ошибки, предупреждение, успех и т.д. Мне просто интересно, есть ли у кого-нибудь идеи, как отображать только сообщения об ошибках:

<ul>
    {% for message in messages.errors %}
        <li>{{ message }}</li>
    {% endfor %}
</ul>

Самое лучшее, что я придумал до сих пор:

{% if messages %}
    {% for message in messages %}
        {% if forloop.first %}
            {% if message.tags == 'error' %}
                <div class="error">
                    <ul>
            {% endif %}
        {% endif %}

        <li>{{ message }}</li>

        {% if forloop.last %}
                </ul>
            </div>
        {% endif %}
    {% endfor %}
{% endif %}

Любые идеи? Спасибо заранее.

Ответ 1

Вы можете установить ifequal:

<ul>
    {% for message in messages.errors %}
        {% if 'error' in message.tags %}<li>{{ message }}</li>{% endif %}
    {% endfor %}
</ul>

Отображение уровня сообщения в тег сообщения можно настроить с помощью MESSAGE_TAGS.

Ответ 2

Немного издевательства, но вы, вероятно, достигнете этого, добавив настраиваемый контекстный процессор шаблонов (см. https://docs.djangoproject.com/en/dev/ref/templates/api/) - что-то вроде

def collect_error_messages(request):
    messages = get_messages(request)
    error_messages = [ m for m in messages if 'error' in m.tags]
    return {'error_messages': error_messages}

затем добавьте это в список TEMPLATE_CONTEXT_PROCESSORS в settings.py, а затем в шаблоны, которые вы можете сделать:

<ul>
    {% for message in error_messages %}
        <li>{{ message }}</li>
    {% endfor %}
</ul>

Вы можете сделать вариацию на том же уровне, чтобы построить уровень ошибки отображения ошибок для сообщения, а затем перебирать каждый dict.

Ответ 3

Ответ Reto работает для меня таким образом

{% for message in messages %}
    {% if 'success' in message.tags %}

        <div class="alert alert-success">
            <a class="close" href="#" data-dismiss="alert">×</a>
            <strong>Success!</strong>

                {{ message }}

        </div>
    {% endif %}
{% endfor %}

{% for message in messages %}
    {% if 'error' in message.tags %}
        <div class="alert alert-error">
            <a class="close" href="#" data-dismiss="alert">×</a>
            <strong>Error!</strong>

                {{ message }}

        </div>
    {% endif %}
{% endfor %}
{% for message in messages %}
    {% if 'info' in message.tags %}
        <div class="alert alert-info">
            <a class="close" href="#" data-dismiss="alert">×</a>
            <strong>INFO!</strong>

                {{ message }}

        </div>
    {% endif %}
{% endfor %}

Ответ 4

вы можете использовать следующие для проверки тегов сообщений.

{% if message.tags == "error" %} your code here {% endif %}

Ответ 5

Мне удалось использовать только теги шаблонов:

{% if messages %}
    {% regroup messages by tags as messages %}
    <div id="messages">
    {% for tags in messages %}
        <ul class="{{ tags.grouper }}">
            {% for message in tags.list %}
                <li>{{ message|capfirst }}</li>
            {% endfor %}
        </ul>
    {% endfor %}
    </div>
{% endif %}

Ключ {% regroup%} тег.

У этого все еще есть некоторые проблемы, потому что атрибут tags включает extra_tags message, поэтому, если вы используете вы получите дополнительные группы <ul>.

В будущих версиях (возможно, 1.7) будет атрибут level_tag, поэтому проблема скоро исчезнет.


(Как только доступен атрибут level_tag)

{% if messages %}
    {% regroup messages by level_tag as messages %}
    <div id="messages">
    {% for level in messages %}
        <ul class="{{ level.grouper }}">
            {% for message in level.list %}
                <li>{{ message|capfirst }}</li>
            {% endfor %}
        </ul>
    {% endfor %}
    </div>
{% endif %}

Ответ 6

Конечно, вы можете сделать это с помощью {% regroup%}, но вы должны использовать dictsort, а также если вы хотите работать правильно. Итак, во-первых, теги должны сортироваться по имени, а затем группировать:

{% if messages %}
    {% regroup messages|dictsort:"tags" by tags as message_list  %}

    {% for tags in message_list %}
        <div class="alert alert-{{ tags.grouper }}">
            <div class="container">
                <ul>
                    {% for message in tags.list %}
                        <li>
                              {{ message }}
                        </li>
                    {% endfor %}
                </ul>
                <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
            </div>
        </div>
    {% endfor %}
{% endif %}