5

我想突出顯示導航菜單中的當前頁面。當你在他們的頁面上時,顯然我需要給菜單鏈接一個類似'active'的類。這是一個經典問題,我見過很多解決方案proposed。我的問題是我討厭所有的人,並認爲他們都不是非常乾的。例如:爲什麼我必須在所有的響應中傳遞RequestContext?

@register.simple_tag 
def active(request, pattern): 
    import re 
    if re.search(pattern, request.path): 
     return 'active' 
    return '' 

---- 

{% load tags %} 
<div id="navigation"> 
    <a class="{% active request "^/about/" %}" href="/about/">About</a> 
    <a class="{% active request "^/contact/" %}" href="/contact/">Contact</a> 
    <a class="{% active request "^/services/" %}" href="/services/">Services</a> 
</div> 

該標籤採用當前的請求和URL表達式返回「積極的」,如果你當前訪問此頁面。或者,這可以通過命名視圖而不是url來完成,但原理是相同的。

我對這個主要問題是,我的導航將在我的意見99%,被稱爲然而,爲了得到當前請求的變量還是有解析的RequestContext的模板,是這樣的:

def contact(request): 
    # snip ... 
    return render_to_response(
       'contact.html', 
       { 'myvar' : myvar }, 
       context_instance=RequestContext(request)) 

爲什麼我需要這個context_instance行添加到時候可能我的看法每一個所有,但其中一個需要爲了得到當前URL /視圖突出活動鏈接請求變量?這似乎非常潮溼,特別是對於絕大多數django站點中的功能。我希望默認包含請求,並能夠選擇性地禁止它。我找不到在中間件中執行此操作的方法,因爲在視圖返回後,無法攔截模板。

有什麼建議嗎?

回答

16

您的意圖很有意義,大多數情況下您需要RequestContext,並且出於性能原因,只能很少安全省略。解決方法很簡單,而不是render_to_response使用direct_to_template快捷:

from django.views.generic.simple import direct_to_template 

def contact(request): 
    # snip ... 
    return direct_to_template(request, 'contact.html', { 'myvar' : myvar }) 

...或django-annoyingrender_to裝飾:

from annoying.decorators import render_to 

@render_to('template.html') 
def foo(request):   
    bar = Bar.object.all() 
    return {'bar': bar}  
1

您不必爲導航的標記做任何事情就可以爲當前的導航提供不同的風格 - 有聲明的方式可以使用CSS來實現。

查看我的答案在這裏:Django: Is there a better way to bold the current page link爲例。

+0

使用body ID命名頁面是個不錯的主意,但body標籤和導航都位於基本模板中。我可以阻止它並向每個擴展模板添加* {%block body_id%}我的頁面{%endblock%} *,但是再次,DRY在哪裏?有什麼辦法可以自動化嗎? 我想要或者使用命名的視圖作爲身體ID或slugify它或某事,而不必明確命名它,並且必須爲每個視圖維護兩個單獨的「名稱」:一個視圖本身和一個css id。 – Jimmy 2009-06-27 07:49:58

+0

我的Django-fu是生鏽的,但不是改變每個擴展模板,你可以傳遞來自contact()和family的CSS名稱:def contact(request):render_to_response('contact.html',{'cssClass':' contact-page','myvar':myvar},...)?仍然不完美幹,但不壞。 – RichieHindle 2009-06-27 08:16:20

相關問題