显示Django消息框架消息

Ari*_*rif 12 django django-templates

我一直在使用Django Messaging Framework在模板中向用户显示消息.

我正在将它们输出到模板,如下所示:

<ul>
    {% for message in messages %}
        <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
    {% endfor %}
</ul>
Run Code Online (Sandbox Code Playgroud)

这会输出所有消息,错误,警告,成功等.我只是想知道是否有人有任何想法如何只显示错误消息:

<ul>
    {% for message in messages.errors %}
        <li>{{ message }}</li>
    {% endfor %}
</ul>
Run Code Online (Sandbox Code Playgroud)

到目前为止,我提出的最好的是:

{% 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 %}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?提前致谢.

Ret*_*old 9

你可以把ifequal:

<ul>
    {% for message in messages.errors %}
        {% if 'error' in message.tags %}<li>{{ message }}</li>{% endif %}
    {% endfor %}
</ul>
Run Code Online (Sandbox Code Playgroud)

可以使用MESSAGE_TAGS配置消息级别到消息标记的映射.


Ben*_*Ben 5

有点faff,但你可以通过添加一个自定义模板上下文处理器来实现这一点(参见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}
Run Code Online (Sandbox Code Playgroud)

然后将其添加到settings.py中的TEMPLATE_CONTEXT_PROCESSORS列表中,然后在模板中执行以下操作:

<ul>
    {% for message in error_messages %}
        <li>{{ message }}</li>
    {% endfor %}
</ul>
Run Code Online (Sandbox Code Playgroud)

您可以对其进行变换以构建对消息的dict映射错误级别,然后遍历每个dict.


小智 5

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 %}
Run Code Online (Sandbox Code Playgroud)

  • 你真的需要再次执行循环吗?看起来在第一个循环中在 message.tags %} 中做一个 `{% elif 'error'(或者在第一个循环之后一个完全独立的 `if`)也应该有效,不是吗? (2认同)