(Django) 如何将'context'(基本信息)传递到每个页面,包括表单?
我对Django还比较陌生(我用的是1.6.2版本),我担心自己可能在走一些不太好的路子,所以我想问一下:
目前我在处理一些简单的页面,比如首页和个人资料页。对于这两个页面,我会检查用户是否登录,使用的是request.user
。如果用户已经登录,我就把他的相关信息放到context{}里,然后发送给模板。
那么,我是不是每个想要包含这些信息的页面都得这么做呢?
#views.py
def home(request):
....etc....
context = {
'players' : players,
'teams' : teams,
}
if request.user.is_authenticated():
p = Player.objects.get(user=request.user)
if p:
context['p'] = p
return render(request, 'home.html', context)
所以我基本上是在检查是否需要把这部分信息添加到context里,如果有的话再发送。问题是,这些信息实际上是作为页眉使用的,应该出现在每个页面上。有没有办法让我在每个页面上都包含这些信息,而不需要通过context传递呢?
非常感谢大家。你们在StackOverflow的帮助真的是让我们这些新手受益匪浅!
2 个回答
2
你可以写一个自定义上下文处理器:
def foo(request):
"""
Adds Player to context
"""
context = {'p': None}
if request.user.is_authenticated():
p = Player.objects.get(user=request.user)
if p:
context['p'] = p
return context
然后把它添加到settings.py文件中的TEMPLATE_CONTEXT_PROCESSORS
元组里(假设foo
放在你应用文件夹里的context_processors.py模块中):
TEMPLATE_CONTEXT_PROCESSORS = (
# ...
"your_app_name.context_processors.foo",
)
0
虽然ndpu已经正确地指出了上下文处理器可以解决这个一般性的问题,但在这种情况下似乎并不需要这么做。
你已经有了当前用户和相关玩家之间的直接关系:我假设这是一个一对一的关系。而且只要你使用RequestContext(你确实在使用,通过render
快捷方式),user
对象已经通过默认的上下文处理器传递到模板上下文中了。所以,实际上你不需要额外的上下文,只需在你的模板中这样做:
{{ user.player }}
就可以获取玩家的信息。