Django-如何使变量可用于所有模板?


73

我想知道如何将变量传递给我的所有模板,而无需在views.py文件中的每个方法上重复相同的代码?

在下面的示例中,我想使类别(类别对象的数组)可用于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))

3
他们被称为CONTEXT PROCESSORS
维克多·卡斯蒂略·托雷斯

Answers:


125

您需要的是上下文处理器,并且创建上下文处理器非常容易。假设您有一个名为的应用custom_app,请执行以下步骤:

  • 加入custom_appINSTALLED_APPSsettings.py(你已经做了了,对不对?);
  • 创建一个context_processors.pyintocustom_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")

或直接在设置的OPTIONS.context_processors键中包含该字符串TEMPLATES


3
是否可以使该项目在项目中的任何应用程序上正常运行,而不仅仅是custom_app
JacobF 2014年

1
@jvannistelrooy是的,有可能。
维克多·卡斯蒂略·托雷斯

1
@EazyC正如您所看到的,该函数的参数是一个请求,因此您可以使用request.user获取登录的用户,然后对它进行任何操作。
维克多·卡斯蒂略·托雷斯

3
我认为您应该添加到TEMPLATES中的OPTIONS.context_processors列表中,而不是添加到自1.8版以来已弃用的TEMPLATE_CONTEXT_PROCESSORS中。
tscizzle 2015年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.