【问题标题】:Displaying Django Messages Framework Messages显示 Django 消息框架消息
【发布时间】:2010-04-23 09:37:51
【问题描述】:

我一直在使用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 %}

有什么想法吗? 提前致谢。

【问题讨论】:

    标签: django django-templates


    【解决方案1】:

    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 %}
    

    【讨论】:

    • 您真的需要再次执行循环吗?看起来在第一个循环中做一个{% elif 'error' in message.tags %}(或在第一个循环之后完全独立的if)也应该有效,不是吗?
    【解决方案2】:

    当然你可以用{% regroup %}标签来做,但如果你想正常工作,你也必须使用dictsort filter。所以首先,标签应该按名称排序,然后分组:

    {% 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 %}
    

    【讨论】:

    • 你把简单的事情复杂化了
    【解决方案3】:

    我只使用模板标签进行管理:

    {% 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_tagsmessage,因此如果您使用它,您将获得额外的&lt;ul&gt; 组。

    在未来的版本 (probably 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 %}
    

    【讨论】:

    • 显示所有消息的好答案
    • 老实说,这是我在这个主题上看到的最佳答案。
    【解决方案4】:

    有点麻烦,但您可能可以通过添加自定义模板上下文处理器来实现这一点(参见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}
    

    然后将其添加到 settings.py 中的 TEMPLATE_CONTEXT_PROCESSORS 列表中,然后在模板中您可以这样做:

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

    您可以对其进行变体以构建一个将错误级别映射到消息的字典,然后遍历每个字典。

    【讨论】:

      【解决方案5】:

      你可以放一个ifequal:

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

      消息级别到消息标签的映射可以配置MESSAGE_TAGS

      【讨论】:

      • 感谢您的回答,但这意味着我必须多次遍历错误以输出所有错误,然后输出所有成功消息。我想要一种方法来自己抓取所有错误。
      • 谢谢。更新了我的答案。
      • 文档说无论如何您都必须遍历所有消息,否则您将留下它们。
      【解决方案6】:

      您可以使用以下来检查消息标签。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-28
        • 2021-10-26
        • 2017-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多