2010-02-09 173 views
14

我有一個包含通用導航菜單的父模板。我希望能夠將class="selected"添加到相應的菜單選項。Django模板 - 我可以設置要在父模板中使用的變量嗎?

我希望能夠設置一個變量在子模板,例如:

{% set menu = "products" %} 

做:

{%ifequal menu "products" %}class="selected"{% endifequal %} 

我不想在視圖設置值因爲我必須將其添加到所有我的視圖方法中,並且我不想在每個子頁面中重複整個菜單html,因爲如果菜單更改,我只想在一個位置更改HTML。

我是從一個「非Django」的思維模式接近這個嗎?

任何幫助將非常感激。謝謝。

+0

+1,我也想知道這個(或者,想知道它的不錯的練習)。類似的效果可能是知道哪個模板被稱爲 – Agos

+0

jinja2支持這個,但我也在尋找一種方法在django中做到這一點。 – Gattster

回答

1

這裏有不止一個答案!

您可以使用自定義模板標籤來繪製菜單並選擇適當的模板標籤。

所以你的模板標籤是:

{% mymainmenu selecteditem %} 

看一看在Django的網站自定義模板標籤文檔,但它最終會是這樣的:

@register.simple_tag 
def mymainmenu(selecteditem): 

    html = '' 

    build the html for the menu here and include selected class 

    return html 
+0

確實有不止一個答案,但這是一個明顯的方法。 (雖然起初它可能不明顯!) – jcdyer

9

上下文你通過你的視圖也可以在你擴展的模板中使用。在上下文中添加'menu_class':'selected',您可以在基本模板中設置

<div id="menu" class="{{ menu_class }}"> 

另一種方法周圍是

<div id="menu" class="mymenu {% block menu_attrib %}{% endblock %}"> 

,然後是可擴展您孩子的模板由

{% block menu_attrib %}selected{% endblock %} 
+0

但是你不能在父模板中重複該塊,對吧? – thomaskonrad

0

謝謝大家 - 我到底遵循斯皮克曼的建議,並把當前菜單的名稱選項在上下文中並使用我的:

{%ifequal menu "products" %} 
    class="selected" 
{% endifequal %} 

子句在每個菜單OPTON。

我不認爲這是一個很好的解決方案,它結合我的「意見」我的「模板」比我更會喜歡......但也許這是隻需S Django的怪癖

+0

然後點擊Speakman答案旁邊的複選標記。順便說一句,Django人似乎有意阻止'{%extends%}'將變量設置爲傳入的值,如函數。 –

+0

任何想法爲什麼Django管理員不喜歡這個? – Gattster

9

備案,它認爲是不好的做法...但你可以做到這一點

{% with "products" as menu %} 
    {{ menu }} 
{% endwith %} 

由於實際上並沒有解決您的具體問題,這裏是一個可能的應用...

<div class='menu'> 
    {% block menuitems %} 
     <a class='{% ifequal menu 'products' %}selected{% endifequal %}' href='/whereever/'>products</a> 
     ... 
    {% endblock %} 
</div> 

,並在子模板

{% block menuitems %} 
    {% with 'products' as menu %} 
     {{ block.super }} 
    {% endwith %} 
{% endblock %} 
+1

哦,你的回答拯救了我的一天。我是django的新手,但在其他框架中使用了這個特性。但是其他答案與我的查詢匹配。 –

+0

謝謝,非常好的主意! – mrash

相關問題