2011-10-26 60 views
0

我即將開始一個新項目,我認爲這次是django。我一直在閱讀過去兩週的文檔,看起來很有希望。如何使用django製作基本模板中的動態菜單

好的,事情是,我找不到任何關於(在C#MVC調用)部分渲染。例如,如果我想要一個動態菜單,其中的菜單項來自數據庫,那麼我希望基本模板(或母版頁)在每個請求上呈現菜單(部分渲染器調用另一個動作或用一些模板呈現模板會話數據)。所以,只要我的模板繼承自這個基礎模板,菜單就可以免費使用。

老實說,我不知道如何做到這一點。


我想要的是基模板中使用未包含在子模板中的數據的一些代碼。每次我調用render_to_response('child_content.html',context)時,我都不想包含額外的變量(也許是'menu_list_items')。這可能嗎?

謝謝!

回答

6

您可以使用context processorcustom template tag來提供此功能。

context_processor是一個簡單的函數,可以將對象添加到每個RequestContext。自定義模板標籤可以有自己的模板片段和上下文,可以爲您呈現菜單。

+0

應該做的把戲:)坦克你 –

0

對於模板重用:您應該爲通用佈局創建基礎模板,併爲各個頁面使用詳細的模板。這已在Django documentation中詳細介紹。

我傾向於對那些通用零件做的(比方說,突出的部位使用是對當前部分菜單),是創建自己的render_to_response功能,類似於如下:

from django.shortcuts import render_to_response as django_render_to_response 
def render_to_response(template, params, context_instance): 
    return django_render_to_response(template, 
         AppendStandardParams(request, params), 
         context_instance) 

ApplyStandardParams該方法然後配置基於電流路徑上的菜單:在這個例子中

def AppendStandardParams(request, params): 
    if request.META['PATH_INFO'].startswith('/customer'): 
     params['category'] = 'customer' 
     params['title'] = 'Customer overview' 
    # and so on for all different parts 

這些categorytitle標籤被用來突出顯示菜單的一些值,配置標題等等。例如:

<!-- Customer menu entry: change class if this is the current category. --> 
<li{% if category == "customer" %} class="selected"{% endif %}>Customers</li> 

最後,使用它在一個視圖,而不是正常的render_to_response進口,我就是這樣做from lib.views import *,這使得在視圖中可用我的定製版本。這樣,視圖中所有代碼的語法都保持不變,但我不必在每次創建新視圖或應用程序時自定義菜單。