关于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'}

推荐阅读

    linux下用户权限命令?

    linux下用户权限命令?,管理,系统,密码,地址,权限,时间,基础,信息,基本知识,

    linux用户名改名命令?

    linux用户名改名命令?,系统,密码,命令,代码,名称,用户名,用户,终端,主机名,

    linux输入命令后乱码?

    linux输入命令后乱码?,系统,乱码,中文,情况,环境,地方,名称,字符集,服务器,

    linux输入命令无反应?

    linux输入命令无反应?,密码,系统,数据,命令,工具,时报,信息,检测,文件,反应,L

    linux用户分组命令?

    linux用户分组命令?,系统,命令,电脑,信息,时间,标准,资料,用户,文件,用户组,L

    linux命令改用户所属?

    linux命令改用户所属?,系统,文件,名称,用户组,命令,用户,名录,基本知识,所

    linux命令行输入引号?

    linux命令行输入引号?,系统,密码,命令,电脑,标准,地方,环境,管理,名字,表示,

    linux系统用户组命令?

    linux系统用户组命令?,系统,管理,密码,代码,用户组,用户,命令,邮箱,电脑,名

    linux用户管理的命令?

    linux用户管理的命令?,系统,管理,信息,地址,工作,用户,单位,基础,数据,命令,L

    linux输入命令删除键?

    linux输入命令删除键?,名称,系统,档案,命令,文件,目录,不了,数据,文件夹,终

    linux用户退出命令行?

    linux用户退出命令行?,状态,档案,标准,系统,命令,文件,模式,编辑,指令,主机,l

    linux多个命令输入?

    linux多个命令输入?,系统,工具,工作,命令,电脑,地址,信息,软件,服务,连续,Lin

    linux命令重复输入?

    linux命令重复输入?,软件,信息,状态,标的,工具,系统,命令,终端,模式,编辑,在l

    linux用户自定义命令?

    linux用户自定义命令?,系统,时间,标准,软件,项目,电脑,服务,工具,基本知识,

    linux用户组命令设置?

    linux用户组命令设置?,管理,系统,密码,代码,电脑,用户组,用户,软件,新增,命

    linux进入用户命令行?

    linux进入用户命令行?,系统,地址,工作,服务,信息,命令,首页,电脑,密码,终端,L

    linux用户用不了命令?

    linux用户用不了命令?,系统,档案,不了,命令,网络,密码,信息,情况,用户,权限,l

    linux连续输入命令?

    linux连续输入命令?,系统,工作,地址,连续,命令,信息,电脑,基础,标准,状态,lin

    linux新增用户组命令?

    linux新增用户组命令?,系统,密码,新增,用户组,联系方式,软件,邮箱,工具,管

    linux显示用户名命令?

    linux显示用户名命令?,密码,系统,信息,时间,地址,命令,用户,用户名,位置,用