2010-04-23 157 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