始终将用户包含在 django 模板上下文中
-
09-06-2019 - |
题
我正在为一家小公司开发一个小型内部网站,用户应该能够在其中发帖。我设想了一种非常简单的身份验证机制,人们只需输入他们的电子邮件地址,就会收到一个唯一的登录 URL,该 URL 会设置一个 cookie,以便在将来的请求中始终识别他们。
在我的模板设置中,我有 base.html,其他页面扩展了它。我想在 base.html 中显示登录或注册按钮,但如何确保必要的变量始终是上下文的一部分?似乎每个视图只是按照自己的喜好设置上下文,并没有全局上下文人口。有没有一种方法可以在不将用户包含在每个上下文创建中的情况下执行此操作?
或者我是否必须创建自己的自定义快捷方式才能正确设置上下文?
解决方案
从更一般的意义上讲,不必在每个视图中显式设置变量,听起来您想考虑编写自己的变量 上下文处理器.
来自文档:
上下文处理器有一个非常简单的接口:它只是一个 Python 函数,它接受一个参数(一个 HttpRequest 对象),并返回一个添加到模板上下文中的字典。每个上下文处理器必须返回一个字典。
其他提示
有 不需要 为用户对象编写一个上下文处理器(如果您已经有了) "django.core.context_processors.auth"
在 TEMPLATE_CONTEXT_PROCESSORS
和 如果你正在使用 RequestContext
在你看来。
如果您使用的是 django 1.4 或最新版本,该模块已移至 django.contrib.auth.context_processors.auth
@瑞安:有关预处理器的文档有点少
@斯塔尔:每次调用视图中的模板时将用户添加到上下文中,DRY
解决方案是使用预处理器
A: :在您的设置中添加
TEMPLATE_CONTEXT_PROCESSORS = (
'myapp.processor_file_name.user',
)
乙: :在 myapp/processor_file_name.py 中插入
def user(request):
if hasattr(request, 'user'):
return {'user':request.user }
return {}
从现在开始,您可以在模板中使用用户对象功能。
{{ user.get_full_name }}
每个答案中都有提示,但对于新手来说,还是从“头开始”:
默认情况下,身份验证数据(几乎)位于模板中——有一个小技巧:
在 views.py
:
from django.template import RequestContext
...
def index(request):
return render_to_response('index.html',
{'var': 'value'},
context_instance=RequestContext(request))
在 index.html
:
...
Hi, {{ user.username }}
var: {{ value }}
...
从这里: https://docs.djangoproject.com/en/1.4/topics/auth/#authentication-data-in-templates
如果出现以下情况,则此模板上下文变量不可用 请求上下文 没有被使用。
@dave在我的模板中使用{{user.username}},然后我将不得不使用requestContext,而不仅仅是普通映射/哈希: http://www.djangoproject.com/documentation/templates_python/#subclassing-context-requestcontext
所以我猜模板引擎没有检查任何全局变量。
但是 RequestContext 有一些预填充类,我可以研究它们来解决我的问题。谢谢。
如果您可以将身份验证挂钩 Django认证方案 你将能够使用 request.user
.
我认为这应该只是一个调用的情况 authenticate()
和 login()
基于您的 Cookie 的内容。
编辑:@Staale - 我总是使用 locals()
诡计 对于我的上下文,以便我的所有模板都可以看到 request
所以 request.user
. 。如果你不是那么我想事情不会那么简单。
默认情况下可以,通过执行以下步骤,确保您已在设置中添加上下文“django.contrib.auth.context_processors.auth”。默认情况下它添加在settings.py中,所以它看起来像这样
TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.core.context_processors.auth',)
你可以像这样访问用户对象,
{% if user.is_authenticated %}
<p>Welcome, {{ user.username }}. Thanks for logging in.</p>
{% else %}
<p>Welcome, new user. Please log in.</p>
{% endif %}
欲了解更多信息,请参阅此处 http://docs.djangoproject.com/en/1.2/topics/auth/#authentication-data-in-templates