在Django模板上下文中始终包含用户

36 投票
8 回答
32077 浏览
提问于 2025-04-11 09:16

我正在为一家小公司制作一个小型的内部网站,用户应该能够发布内容。我想了一个非常简单的登录机制,用户只需要输入他们的电子邮件地址,然后会收到一个独特的登录链接,这个链接会设置一个cookie,以后每次请求时都能识别他们。

在我的模板设置中,有一个base.html,其他页面都是基于这个模板的。我想在base.html中显示登录或注册按钮,但我该如何确保必要的变量总是包含在上下文中呢?看起来每个视图都只是根据自己的需要设置上下文,并没有全局的上下文设置。有没有办法在不在每次创建上下文时都包含用户的情况下做到这一点呢?

还是说我必须自己制作一些自定义的快捷方式来正确设置上下文呢?

8 个回答

33

@Ryan: 关于预处理器的文档有点少

@Staale: 每次在视图中调用模板时都要把用户添加到上下文,这样不太好

解决办法是使用预处理器

A: 在你的设置中添加

TEMPLATE_CONTEXT_PROCESSORS = (
    'myapp.processor_file_name.user',
)

B: 在 myapp/processor_file_name.py 中插入

def user(request):
    if hasattr(request, 'user'):
        return {'user':request.user }
    return {}

从现在开始,你可以在模板中使用用户对象的功能了。

{{ user.get_full_name }}
46

如果你已经在 "django.core.context_processors.auth" 中添加了用户认证的处理器,并且在你的视图中使用了 RequestContext,那么就不需要再为用户对象写一个上下文处理器了。

如果你使用的是 Django 1.4 或更新的版本,这个模块已经移到了 django.contrib.auth.context_processors.auth

20

从更广泛的角度来看,如果你不想在每个视图中都明确设置变量,那你可以考虑写一个自己的上下文处理器

根据文档的说明:

上下文处理器的接口非常简单:它只是一个Python函数,接收一个参数,也就是HttpRequest对象,然后返回一个字典,这个字典会被添加到模板的上下文中。每个上下文处理器必须返回一个字典。

撰写回答