7

我在這個例子中hereDjango的:如何讓所呈現的模板的名稱

項目在導航欄是<li>'s實施bootstrapnavbar作爲展會上,「選擇」項具有屬性class="active"

<li class="active"> <a href="#"> Link1 </a> </li> 
    <li>    <a href="#"> Link2 </a> </li> 

在Django中,這些項目將位於一個模板中,該模板包含在任何應該顯示導航欄的模板中。我正想着做這種方式:

<li> <a href="/"  class="{% if template_name == "home.djhtml" %}active{% endif %}"> Home </a> </li> 
<li> <a href="about/" class="{% if template_name == "about.djhtml" %}active{% endif %}"> About </a> </li> 
<li> <a href="contact/" class="{% if template_name == "contact.djhtml" %}active{% endif %}"> Contact </a> </li> 

我想知道是否有一個內置的方式來獲得template_name(即,模板被渲染,傳遞給render_to_response(),在views.py

當然,我可以明確地添加一個template_name變量到render_to_response(),這可以解決問題。但考慮幹,我覺得這不應該需要。

+1

顯式優於隱式:) –

+0

您不應該在模板中硬編碼url(使用'{%url%}'templatetag代替),並且您應該依賴urls和'request.path' - 而不是模板名稱 - 檢查鏈接是否有效。 –

+0

感謝您指出@bruno,我會改變這一點。 –

回答

14

我通常使用一個自定義的模板標籤用於該用途的情況下,增加一類的活動標籤,菜單項等

@register.simple_tag 
def active_page(request, view_name): 
    from django.core.urlresolvers import resolve, Resolver404 
    if not request: 
     return "" 
    try: 
     return "active" if resolve(request.path_info).url_name == view_name else "" 
    except Resolver404: 
     return "" 

下面是從頂部導航片段:

<ul class="nav"> 
    <li class="{% active_page request "about" %}"><a href="{% url "about" %}">About</a></li> 
    ... 
</ul> 
+0

謝謝。我應該如何訪問'request'對象:將它作爲'dictionary'變量傳遞給'render()'? –

+1

這是如何:http://stackoverflow.com/questions/702592/django-request-in-template – slumtrimpet

+0

@slumtrimpet有它。它由'RequestContext'提供,假設您在模板渲染中使用它(基於Django的基於類的視圖自動執行)。 –

2

有一個更快的方法,而不創建任何自定義模板標籤!

<ul class = 'nav'> 
    <li class="{% ifequal request.path 'about/'%} active {% endifequal%}"> 
     <a href="{% url "about" %}">About</a> 
    </li> 
</ul> 

請注意request.path。它可能是在開始時使用斜槓符號,或者在路徑末尾沒有!

0

追加prog.Dusans答案Django的1.7

settings.py 
TEMPLATE_CONTEXT_PROCESSORS = (
    'django.core.context_processors.request', 
    'django.contrib.auth.context_processors.auth' 
) 

views.py 
from django.shortcuts import render 

def index(request): 
    return render(request, 'index.html') 

template 
{% ifequal request.path '/pathname'%}active{% endifequal%} 

最好的是它,所以你只需要做一次添加到基本模板。

像我這個版本超過Kevin Stones,因爲你必須添加幾乎相同的代碼到模板,畢竟不需要模板標籤。

3

我用:

class="{% if 'about' in request.path %}active{% endif %}" 

這是短了一點,如果URI的變化更穩健,只是看出來,如果一個以上的路徑使用有關。

相關問題