2010-04-23 155 views
11

我一直在使用Django Messaging Framework来向模板中的用户显示消息。显示Django消息框架消息

我将其输出到模板是这样的:

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

有什么想法? 在此先感谢。

回答

9

你可以把一个ifequal:

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

消息级别的消息,以标签的映射可以与MESSAGE_TAGS进行配置。

+0

感谢您的回答,但这意味着我必须多次遍历错误才能输出所有错误,然后输出所有成功消息。我想要一种方法来自己抓住所有的错误。 – Arif 2010-04-23 11:09:32

+1

它应该是:{%if'message.tags%error' – 2013-01-10 13:51:07

+0

谢谢。更新了我的答案。 – 2013-01-11 15:08:16

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} 

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

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

你可以做同样的变化,以建立一个字典映射错误级别消息,然后通过每个迭代字典。

3

雷托的回答对我的作品以这种方式

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

你真的需要再次执行循环吗?看起来像在第一个循环中执行'message.tags%'中的{%elif'错误')(或者在第一个循环之后完全独立的“if”)也可以工作,不是吗? – user558061 2013-06-22 11:17:28

0

我只用模板标签管理:

{% 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属性包括messageextra_tags所以如果你使用它,你会得到更多的<ul>组。

在将来的版本(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 %} 
+0

显示所有讯息的好答案 – ppython 2017-10-18 13:49:20

1

你可以用下面的检查信息的标签。

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

-1

当然你也可以用{% 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 %} 
+0

您正在使简单的事情变得复杂 – 2016-12-24 03:55:36