我正在为一家小型公司的小型Intranet网站工作,用户应该可以在其中发布信息。我想象过一种非常简单的身份验证机制,人们只需输入他们的电子邮件地址,并向其发送一个唯一的登录URL,该URL就会设置一个cookie,该cookie将始终为将来的请求标识他们。
在我的模板设置中,我有base.html,其他页面对此进行了扩展。我想在base.html中显示"登录"或"注册"按钮,但是如何确保必要的变量始终是上下文的一部分?似乎每个视图只是按照自己的喜好设置了上下文,并且没有全局上下文总体。有没有一种方法可以在不包含用户的情况下创建每个上下文?
还是我必须创建自己的自定义快捷方式才能正确设置上下文?
如果您已经在TEMPLATE_CONTEXT_PROCESSORS中使用了"django.core.context_processors.auth"并且在视图中使用了RequestContext,则无需为用户对象编写上下文处理器。
如果使用的是django 1.4或最新版本,则模块已移至django.contrib.auth.context_processors.auth
@Ryan:有关预处理器的文档有点小
@Staale:每次在视图中调用模板DRY
时,将用户添加到上下文中
解决方案是使用预处理器
A:在您的设置中添加
1 2 3
| TEMPLATE_CONTEXT_PROCESSORS = (
'myapp.processor_file_name.user',
) |
B:在myapp / processor_file_name.py中插入
1 2 3 4
| def user(request):
if hasattr(request, 'user'):
return {'user':request.user }
return {} |
从现在开始,您就可以在模板中使用用户对象功能。
1
| {{ user.get_full_name }} |
从一般意义上讲,不必在每个视图中显式设置变量,这听起来像是您想研究编写自己的上下文处理器。
来自文档:
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.
每个答案中都有提示,但是对于新手,还是从"从头开始":
默认情况下,身份验证数据位于模板中(几乎)-有一个小技巧:
中的
:
1 2 3 4 5 6
| from django.template import RequestContext
...
def index(request):
return render_to_response('index.html',
{'var': 'value'},
context_instance=RequestContext(request)) |
中的
:
1 2 3 4
| ...
Hi, {{ user.username }}
var: {{ value }}
... |
从这里:https://docs.djangoproject.com/en/1.4/topics/auth/#authentication-data-in-templates
This template context variable is not available if a RequestContext is
not being used.
@戴夫
要在模板中使用{{user.username}},则必须使用
requestcontext而不是普通的map / hash:http://www.djangoproject.com/documentation/templates_python/#subclassing-context-requestcontext
所以我想模板引擎不会检查任何全局变量。
但是RequestContext有一些预填充的类,我可以通过这些类来解决我的问题。谢谢。
如果您可以将身份验证与Django身份验证方案挂钩,则可以使用request.user。
我认为这只是基于Cookie的内容调用authenticate()和login()的一种情况。
编辑:@Staale-我始终在上下文中使用locals()技巧,以便我的所有模板都可以看到request,因此也可以看到request.user。如果您不是,那么我想那不是那么简单。
在默认情况下可能会执行以下步骤,以确保已在设置中添加了上下文" django.contrib.auth.context_processors.auth"。默认情况下,它添加到settings.py中,所以它看起来像这样
1 2 3 4
| TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.core.context_processors.auth',) |
您可以像这样访问用户对象,
1 2 3 4 5
| {% 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
使用context_processors。 https://docs.djangoproject.com/zh-CN/2.2/ref/settings/#std:setting-TEMPLATES-OPTIONS
settings.py
1 2 3 4 5 6 7 8 9
| 'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
'myapp.functions.test'
],
}, |
myapp/functions.py
1 2
| def test(request):
return {'misc': 'misc'} |