关于python:始终在django模板上下文中包括用户

关于python:始终在django模板上下文中包括用户

Always including the user in the django template context

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

推荐阅读