(Django) 如何将'context'(基本信息)传递到每个页面,包括表单?

1 投票
2 回答
1625 浏览
提问于 2025-04-18 03:30

我对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 }}

就可以获取玩家的信息。

撰写回答