始终将用户包括在Django模板上下文中
我正在为一家小型公司的小型Intranet网站工作,用户应该可以在其中发布信息。我想象过一种非常简单的身份验证机制,人们只需输入他们的电子邮件地址,并向其发送一个唯一的登录网址即可,该网址设置了一个cookie,该cookie可以始终为将来的请求标识他们。
在我的模板设置中,我有base.html,其他页面对此进行了扩展。我想在base.html中显示"登录"或者"注册"按钮,但是如何确保必要的变量始终是上下文的一部分?似乎每个视图只是按照自己的喜好设置了上下文,并且没有全局上下文人口。有没有没有在每个上下文创建中都包含用户的方法?
还是我必须制作自己的自定义快捷方式才能正确设置上下文?
解决方案
回答
如果我们可以将身份验证与Django身份验证方案挂钩,则可以使用request.user
。
我认为这只是基于Cookie的内容调用" authenticate()"和" login()"的一种情况。
编辑:@Staale我一直在为上下文使用" locals()"技巧,以便所有模板都可以看到" request"和" request.user"。如果我们不是,那么我想那不是那么简单。
回答
从不必在每个视图中显式设置变量的更一般的意义上讲,这听起来像我们想研究编写自己的上下文处理器。
从文档中:
A context processor has a very simple interface: It's just a Python function that takes one argument, an HttpRequest object, and returns a dictionary that gets added to the template context. Each context processor must return a dictionary.
回答
@戴夫
要在模板中使用{{user.username}},则必须使用
requestcontext而不是普通的map / hash:http://www.djangoproject.com/documentation/templates_python/#subclassing-context-requestcontext
因此,我想模板引擎不会检查任何全局变量。
但是RequestContext有一些预填充的类,我可以通过这些类来解决我的问题。谢谢。
回答
@Ryan:有关预处理器的文档很小
@Staale:每次在视图中调用模板时,将用户添加到上下文中,DRY
解决方案是使用预处理器
答:在设置中添加
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 }}
回答
如果我们在TEMPLATE_CONTEXT_PROCESSORS中已经有" django.core.context_processors.auth"并且在视图中使用了RequestContext,则无需为用户对象编写上下文处理器。
如果我们使用的是django 1.4或者最新版本,则该模块已移至django.contrib.auth.context_processors.auth。