2013-07-27 41 views
35

我想知道如何將一個變量傳遞給我的所有模板,而不必在我的views.py文件中的每個方法上重複相同的代碼?Django - 如何使一個變量可用於所有模板?

在下面的例子中,我想讓類別(一個類別對象的數組)可用於Web應用程序中的所有模板。

Eg: I would like to avoid writing 'categories':categories on every method. Is it possible? 

一種觀點方法

def front_page(request): 
    categories = Category.objects.all() 
    if is_logged_in(request) is False: 
     return render_to_response('users/signup.html', {'is_logged_in': is_logged_in(request), 'categories':categories}, context_instance=RequestContext(request)) 
    else: 
     return render_to_response('users/front_page.html', {'is_logged_in': is_logged_in(request), 'categories':categories},context_instance=RequestContext(request)) 

另一種觀點方法

def another_view_method(request): 
    categories = Category.objects.all() 
    return render_to_response('eg/front_page.html', {'is_logged_in': is_logged_in(request), 'categories':categories},context_instance=RequestContext(request)) 
+1

他們被稱爲'上下文處理器' –

回答

71

你想要的是一個上下文處理器,並且它很容易創建一個。假設你有一個名爲custom_app一個應用程序,請按照下面的步驟:

  • 添加custom_appINSTALLED_APPSsettings.py(你已經做了了,對不對?);
  • 創建一個context_processors.pycustom_app文件夾;
  • 下面的代碼添加到新的文件:

    def categories_processor(request): 
    categories = Category.objects.all()    
    return {'categories': categories} 
    
  • 添加context_processors.pyTEMPLATE_CONTEXT_PROCESSORSsettings.py

    TEMPLATE_CONTEXT_PROCESSORS += ("custom_app.context_processors.categories_processor",) 
    

現在你可以在所有的模板使用{{categories}}:d

個作爲Django的1.8

的要添加TEMPLATE_CONTEXT_PROCESSORS,在設置中必須添加下面的代碼:

TEMPLATES[0]['OPTIONS']['context_processors'].append("custom_app.context_processors.categories_processor") 

或者直接包括在你TEMPLATES設定OPTIONS.context_processors密鑰字符串。

+0

它的工作!謝謝:) – ipegasus

+0

不客氣的人:D –

+0

是否可以在項目中的任何應用程序中使用這個工作,而不是隻使用'custom_app'? – jvannistelrooy

相關問題