Django - 如何使一个变量在所有模板中都可用?

93

我想知道如何将变量传递给所有模板,而无需在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))

4
它们被称为“上下文处理器”。 - Victor Castillo Torres
有时我们真的不需要创建上下文处理器。 - Tiago Martins Peres
1个回答

151

你需要一个上下文处理器,创建一个非常容易。假设你有一个名为custom_app的应用程序,请按照以下步骤进行:

  • custom_app添加到settings.py中的INSTALLED_APPS(你已经完成了,对吧?);
  • custom_app文件夹中创建一个context_processors.py文件;
  • 将以下代码添加到这个新文件中:

def categories_processor(request):
 categories = Category.objects.all()            
 return {'categories': categories}
  • settings.py中的TEMPLATE_CONTEXT_PROCESSORS中添加context_processors.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键中。


    3
    这个项目中的任何应用程序都可以使用这个方法,而不仅仅是“custom_app”吗? - JacobF
    1
    @jvannistelrooy 是的,这是可能的。 - Victor Castillo Torres
    1
    @EazyC 你可以看到函数的参数是一个请求(request),所以你可以通过request.user获取已登录的用户,并对其进行任何操作。 - Victor Castillo Torres
    6
    我认为,你应该将内容添加到TEMPLATES中的OPTIONS.context_processors列表中,而不是添加到TEMPLATE_CONTEXT_PROCESSORS中,因为自1.8版本以来已经弃用了TEMPLATE_CONTEXT_PROCESSORS。 - tscizzle
    1
    @PoulaAdel 请查看此链接:https://docs.djangoproject.com/en/3.0/ref/templates/api/ - Victor Castillo Torres
    显示剩余6条评论

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接