2009-05-06 81 views
17

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

回答

22

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'}) 
+0

这似乎是对我更好的答案 – Rasiel 2009-05-07 03:47:09

+0

是的,我换了它,因为额外的处理器位是我真正以后。 – rennat 2009-05-07 14:24:19

1

您可以只透过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'}) 
+0

我认为这会为这个特殊的情况下工作,但想在这里想更大:如果我有需要有通过意见随机有3个或4背景处理器功能,在这一点上,我应该只需要导入他们,在需要他们的观点中打电话给他们?由于上下文处理器是一种无所谓的事情吗? – rennat 2009-05-06 20:17:33

+3

对,settings.py中的上下文处理器对于RequestContext是全部或没有。一个更灵活的方法是为每个需要的处理器集合设置RequestContext的子类,并在那里设置上下文处理器,这样你就可以拥有SidebarContext和CommentsContext等等。这也可以使settings.py中的上下文处理器不受影响,使它们更专用,如果你有许多使用上下文处理器的应用程序,这会更好。那么,你只需要一个很好的方式来链接它们... – tghw 2009-05-07 05:02:24