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

时间:2020-03-05 18:46:59  来源:igfitidea点击:

我正在为一家小型公司的小型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。