2013-11-15 80 views
1

我正在覆蓋Django中admintemplate的index.html。 我想在側邊欄上添加一個額外的字段,只有在接口爲真時纔會顯示該字段。Django templatetag return True或False

這裏爲m的index.html的重要組成部分:

{% block sidebar %} 
<div id="content-related"> 
{% if action_needed %} 
    <div class="my-module"> 
     <h2>Foobar</h2> 
     <p>Display this over the sidebar</p> 
    </div> 
{% endif %} 
... Sidebarstuff... 
{% endblock %} 

這裏是我的templatetag:

@register.simple_tag 
def action_needed(): 
    if some_conditon: 
     return True 
    else: 
     return False 

的問題是,是,我的模塊顯示所有的時間。 在另一個線程中,我讀到有關使用過濾器而不是模板標籤,但Django文檔說,至少需要1個參數用於過濾器。但我只是想要一個真/假的回報。

這樣做的最好方法是什麼?

編輯: 這裏有更多的代碼,以顯示你究竟是什麼即時通訊做: 我有具有DateTimeField字段到期日期來存儲,如果帳戶過期模型帳戶。

exp = Account.objects.filter(expiration_date__lte = timezone.now()) 
if len(exp) == 0: 
    return False 
else: 
    return True 

EDIT2: 我解決了這個問題,但我不知道,如果它是一個非常優雅的方式。因爲我沒有足夠的reputition回答我的問題,我需要在這裏分享我的解決方案:

我把HTML的代碼,如果templatetag內我的模塊並返回,如果條件爲真:

@register.simple_tag 
def action_needed(): 
    if some_conditon: 
     return '<div class="my-module"><h2>Foobar</h2><p>Display this over the sidebar</p></div>' 
    else: 
     return '' 

在模板現在我只需要調用

{% action_needed %} 
+0

什麼是'some_condition'?它依賴於什麼? –

+0

這取決於沒有。只需檢查我的數據庫中是否有模型的對象 – 0xAffe

+0

如果您創建了一個過濾器,可以將正在數據庫中檢查的模型的名稱作爲參數 –

回答

0

你的第一種方法(action_needed標籤返回布爾值+ if標記)不起作用導致模板標籤不能用作另一個模板的「參數」,因此您的{% if action_needed %}嘗試在上下文中嘗試解析變量,其名稱爲action_needed

如果測試(「some_condition」)在目前情況下取決於某個對象可用,您可以使用應用到該對象的自定義過濾器,即:

@register.filter 
def action_needed(obj): 
    return some_test_on(obj) 

{% if obj|action_needed %} 
    whatever 
{% endif %} 

否則,好了,你或者可以寫入一個賦值標籤在上下文中設置標誌,然後測試標誌,或者像你最終做的那樣,寫一個標籤來做測試並返回合適的html代碼片段。

正如一個側面說明 - 這一點:

exp = Account.objects.filter(expiration_date__lte = timezone.now()) 
if len(exp) == 0: 
    return False 
else: 
    return True 

是寫這一個複雜的方式:

return len(Account.objects.filter(expiration_date__lte=timezone.now())) > 0 

這是寫一個低效的方式:

return Account.objects.filter(expiration_date__lte=timezone.now()).exists() 
+0

那麼,我的解決方案還行嗎?我認爲這可能會有點「不好的風格」,如果你知道我的意思。 – 0xAffe

+0

有模板標籤生成HTML片段是好的,是的。至於是否更好地使用assignement標籤在上下文中設置標誌,然後測試該標誌並相應地執行或者使templatetag處理測試和生成html(或純文本或其他)代碼段,它真的取決於具體的用例和你自己的喜好。我唯一的觀察是關於命名 - 'action_needed'對於謂詞來說是一個好名字,但對於包含標籤來說不是這樣。 –

+0

[轉碼標籤](https://docs.djangoproject.com/en/1.5/howto/custom-template-tags/#assignment-tags)非常棒!謝謝。 – 0xAffe

0

您可以創建一個自定義模板標籤,如果條件滿足,檢查。如果它是真的,則在標籤之間呈現html。

{% block sidebar %} 
<div id="content-related"> 
{% ifaction %} 
    <div class="my-module"> 
     <h2>Foobar</h2> 
     <p>Display this over the sidebar</p> 
    </div> 
{% endifaction %} 
... Sidebarstuff... 
{% endblock %} 

你可以看到它是如何通過查看石像鬼的 ifswitch tag的代碼來完成。

+0

傳遞給我,在做什麼?您只在{%if action%} – 0xAffe

+0

之間移除了一個空格我的意思是您創建了一個名爲ifaction的自定義模板標記,而不是使用模板標記的標準django。 – user2995894

0

你可以在這裏採取幾種方法。其中一個想法是將some_condition檢查作爲上下文處理器,因此它會自動包含在所有模板中 - 儘管如果您只希望在一個模板中使用它,那就太過於誇張了。

更好的方法是使用包含標籤。這樣,目前在{% if action_needed %}標籤內的代碼將位於一個單獨的模板片段中,只有在條件爲真時才被包含。或者,您可以使用分配代碼在上下文中設置變量,然後在if內對其進行檢查。

(另請注意,你的代碼是非常低效的,因爲它可能涉及到讓所有未來Account對象。你應該做if exp.exists()做了一個簡單的存在性檢查來代替。)

+0

謝謝你的幫助。我用另一種方式解決了它。問題是,我無法回答我自己的問題,因爲我沒有足夠的聲譽...... – 0xAffe