【问题标题】:Django - How to make a variable available to all templates?Django - 如何使变量可用于所有模板?
【发布时间】:2013-07-27 21:40:47
【问题描述】:

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

【问题讨论】:

  • 他们叫CONTEXT PROCESSORS

标签: python django django-nonrel


【解决方案1】:

您需要的是一个上下文处理器,而且创建它非常容易。假设您有一个名为 custom_app 的应用,请按照以下步骤操作:

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

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

    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 键中。

【讨论】:

  • 是否可以使项目中的任何应用程序都可以使用此功能,而不仅仅是custom_app
  • @jvannistelrooy 是的,有可能。
  • @EazyC 可以看到函数的参数是一个请求,所以你可以通过request.user获取登录的用户,对它做任何你想做的事情。
  • 我认为与其添加到 TEMPLATE_CONTEXT_PROCESSORS(自 1.8 起已弃用),不如添加到 TEMPLATES 中的 OPTIONS.context_processors 列表中。
猜你喜欢
  • 1970-01-01
  • 2020-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-05
  • 2021-08-19
  • 2013-09-05
相关资源
最近更新 更多