2012-10-16 80 views
23

我有一個從許多視圖使用的Django模板。該模板有一個消息塊用於通知用戶任何應引起他們注意的事情。是否發送消息取決於視圖。某些視圖可能會向模板發送message變量,而其他視圖可能不會。如何檢查是否定義了django模板變量?

view_1: 
    message = "This is an important message" 
    render_to_response("my_template.html", 
         {'message':message, 'foo':foo, 'bar':bar}, 
         context_instance = RequestContext(request)) 

view_2: 
    message = "This is an important message" 
    render_to_response("my_template.html", 
         {'foo':foo, 'bar':bar}, 
         context_instance = RequestContext(request)) 

在模板中,我檢查該message變量和包括如下的塊:

base_template.html: 
    .... 
    {% block main_body %} 
     {% block messages %} 
     {% endblock %} 
     {% block content %} 
     {% endblock %} 
    {% endblock %} 
    .... 

my_template.html: 
    {% extends base_template.html %} 
    .... 
    {% if message %} 
      {% block messages %} 
       <div class='imp_msg'>{{ message }} </div> 
      {% endblock %} 
    {% endif %} 
    ... 

問題是,即使view_2不通過的消息,則最終的HTML呈現與<div class='imp_msg'></div> - 基本上是一個空的div。

由於該CSS旨在爲消息提供light_red背景,因此我所看到的是頁面頂部的空白light_red欄。

我也試過:{% ifnotequal message None %}{% ifnotequal message '' %},嘗試設置messageNone''明確,但似乎並沒有幫助。

希望得到一些幫助!

回答

28

你需要切換你的{% block %}和你{% if %}

{% block messages %} 
    {% if message %}<div class='imp_message'>{{ message }}</div>{% endif %} 
{% endblock %} 
+0

Thanks @Colleen。這工作。你能解釋一下爲什麼另一種方式沒有?我只是覺得只有在消息存在的情況下才包含該塊是合乎邏輯的。 – zaphod

+0

我認爲這是因爲你的基本模板中有{%block messages%},並且django模板呈現引擎會將其取出並在其擴展的任何位置查找並注入該塊,並忽略任何「if」或其他任何東西。話雖如此,我不能向你發誓,{%block%}'附近的'{%if%}'永遠無法工作 - 我從來沒有嘗試過,所以我也不知道。這可能是因爲它永遠不會起作用,這是主要問題,而不是你在你的基地中有'{%block messages%}'。 – Colleen

+2

http://stackoverflow.com/questions/942797/why-cant-i-nest-a-block-tag-inside-an-if-tag使它聽起來好像它是前者。我認爲如果你的'{%if%}'在基礎上,那麼它就會起作用。或者如果該塊不在基地。 – Colleen

11

要檢查,在if語句,你需要的值相比較無,像這樣:

{% if some_missing_var != None %} 
    // code here if some_missing_var exists 
{% else %} 
    // code here if some_missing_var does not exist 
{% endif %} 

在其他情況下(來自文檔):

通常,如果一個變量不存在,模板系統將插入引擎的string_if_invalid配置選項的值n,默認設置爲''(空字符串)。

我試了一些其他的答案,他們沒有工作,直到我閱讀文檔,並明確上述。

link to docs that describe handling invalid variables

+1

這對我很好。在我的用例中,我得到了搜索結果列表,如果我做了{{if if result%}',即使定義了'result'但是爲空,它也失敗了。我希望它在'result'被定義時通過,當結果沒有被定義時失敗。對於空「結果」,我想顯示另一條消息。檢查「無」效果很好。 – Anupam

相關問題