(Django)将“上下文”(基本信息)传递给每个页面,甚至是表单?

时间:2014-04-20 15:27:16

标签: python django django-forms django-views

我是Django的新手(使用1.6.2),我担心我可能会陷入糟糕的行为,所以我必须问:

目前我正在处理一些简单的观点:家庭,个人资料。对于这两个视图,我检查用户是否使用request.user登录。如果该用户已登录,我将其信息传递到上下文{}并将其发送到模板。

那么,对于我想要包含该信息的每个视图,我基本上都需要这样做吗?

#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)

所以我基本上会检查是否应该在发送之前将该位信息添加到上下文中。问题是,这个信息确实用作标题,应该在每个页面上。有没有办法让我把它包含在每个视图中而不通过上下文?

非常感谢提前。 StackOverflow的你们真的帮了我们这么多人开始了!

2 个答案:

答案 0 :(得分:2)

您可以撰写custom context processor

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",
)

答案 1 :(得分:0)

虽然ndpu已正确地指向上下文处理器来解决一般问题,但在这种情况下似乎没有任何需要。

您已经在当前用户和相关玩家之间建立了直接关系:我认为这是一对一的。并且user对象已经由默认的上下文处理器传递给模板上下文,只要您使用RequestContext(您是通过render快捷方式。)因此,没有任何额外的上下文所有,您只需在模板中执行此操作:

{{ user.player }}

获得玩家。