什么时候适合使用 Django 上下文处理器?

Posted

技术标签:

【中文标题】什么时候适合使用 Django 上下文处理器?【英文标题】:When is it appropriate to use Django context processors? 【发布时间】:2010-10-24 07:07:23 【问题描述】:

如果我大约一半的视图需要相同的数据集,是否适合使用上下文处理器使数据始终可用,或者是否有更好的方法来避免重复代码以跨多个视图获取数据而无需查询视图中不使用的数据?

【问题讨论】:

【参考方案1】:

RequestContext 初始化程序将运行设置文件中列出的任何上下文处理器,但它也需要运行其他处理器的列表。任何通用上下文处理器都可以放在 settings.py 中,更具体的上下文处理器可以根据具体情况添加到RequestContext

完全离开 RequestContext 以不运行任何上下文处理器。

# want context processors listed in settings.py as well as some more specific ones
return render_to_response('template.html', 'foo':'bar', context_instance=RequestContext(request, processors = extra_processors))

# want only context processors listed in settings.py
return render_to_response('template.html', 'foo':'bar', context_instance=RequestContext(request))

# no context processors
return render_to_response('template.html', 'foo':'bar')

【讨论】:

这对我来说似乎是更好的答案 是的,我换了它,因为额外的处理器位是我真正想要的。【参考方案2】:

您可以通过仅将RequestContext(request) 仅传递给需要它的视图来过滤掉哪些视图实际使用上下文处理器,例如:

# want context processors
return render_to_response('template.html', 'foo':'bar', context_instance=RequestContext(request))

# no context processors
return render_to_response('template.html', 'foo':'bar')

【讨论】:

我认为这适用于这种特殊情况,但在这里尝试更大的思考:如果我有 3 或 4 个视图随机需要的上下文处理器函数,那么我应该只导入他们并在需要他们的意见中调用他们?因为上下文处理器是一种全有或全无的东西,对吧? 对了,settings.py 中的上下文处理器全部或没有RequestContext。一种更灵活的方法是为您想要的每组处理器子类化 RequestContext 并在那里设置上下文处理器,这样您就可以拥有 SidebarContext 和 CommentsContext 等。这也将使上下文处理器脱离 settings.py,这将使它们更加特定于应用程序,如果您有许多使用上下文处理器的应用程序,这会更好。那么,你只需要一个很好的方法来链接它们......

以上是关于什么时候适合使用 Django 上下文处理器?的主要内容,如果未能解决你的问题,请参考以下文章

Django 中的上下文是啥?

Django 上下文处理器

在 django 中使用上下文处理器流式处理模板上下文

django上下文处理器

Django之上下文处理器

在不使用上下文处理器的情况下访问 django 1.7 模板中的 URL 参数