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

Sta*_*ale 29 python authentication django cookies session

我正在一个小型公司的小型内部网站上工作,用户应该能够发布.我想象了一种非常简单的身份验证机制,人们只需输入他们的电子邮件地址,就会收到一个唯一的登录URL,它会设置一个cookie,以便在将来的请求中识别它们.

在我的模板设置中,我有base.html,其他页面扩展了这个.我想在base.html中显示登录或注册按钮,但是如何确保必要的变量始终是上下文的一部分?似乎每个视图都只是根据自己的喜好设置上下文,并且没有全局上下文填充.有没有办法在不在每个上下文创建中包含用户的情况下执行此操作?

或者我是否必须制作自己的自定义快捷方式才能正确设置上下文?

Dan*_*iel 43

如果您已经拥有in 并且如果您在视图中使用,则无需为用户对象编写上下文处理器."django.core.context_processors.auth"TEMPLATE_CONTEXT_PROCESSORS RequestContext

如果您使用的是django 1.4或最新的模块已移至 django.contrib.auth.context_processors.auth

  • 使用Django 1.3中的render()(https://docs.djangoproject.com/en/dev/topics/http/shortcuts/#render)自动包含RequestContext. (4认同)
  • 如果未使用RequestContext,则此模板上下文变量不可用. (3认同)

zal*_*lun 33

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

@Staale:每次在视图中调用模板时,将用户添加到Context,DRY

解决方案是使用预处理器

:在你的设置中添加

TEMPLATE_CONTEXT_PROCESSORS = (
    'myapp.processor_file_name.user',
)
Run Code Online (Sandbox Code Playgroud)

B:在myapp/processor_file_name.py中插入

def user(request):
    if hasattr(request, 'user'):
        return {'user':request.user }
    return {}
Run Code Online (Sandbox Code Playgroud)

从现在开始,您可以在模板中使用用户对象功能.

{{ user.get_full_name }}
Run Code Online (Sandbox Code Playgroud)

  • @hobbes3因为你没有使用RequestContext,所以上下文处理器不会被执行. (4认同)

Rya*_*eld 18

在更一般的意义上,不必在每个视图中显式设置变量,听起来你想要编写自己的上下文处理器.

来自文档:

上下文处理器有一个非常简单的接口:它只是一个Python函数,它接受一个参数,一个HttpRequest对象,并返回一个被添加到模板上下文的字典.每个上下文处理器必须返回一个字典