Django:从模板中访问会话变量?


133

如果我在Django中设置会话变量,例如:

request.session["name"] = "name"

有什么方法可以从模板中访问它,还是必须从视图中检索它,然后将其传递给模板?

询问是因为我想在模板中访问大约10个小会话变量,然后将所有10个从视图传递到模板可能会有点混乱。

(我必须使用会话变量,因为它是HttpResponseRedirect,但是出于我的目的,将变量存储在数据库中是过大的。)

那么-有什么方法可以直接在模板中获取会话变量?

Answers:


224

您需要添加django.core.context_processors.request模板上下文处理器。然后,您可以像这样访问它们:

{{ request.session.name }}

如果使用的是自定义视图,请确保要传递RequestContext实例。来自文档的示例:

from django.shortcuts import render_to_response
from django.template import RequestContext

def some_view(request):
    # ...
    return render_to_response('my_template.html',
                              my_data_dictionary,
                              context_instance=RequestContext(request))

2013年更新:从我仍然收到此答案的支持来看,人们对它的帮助仍然存在,距最初编写已经三年多了。但是请注意,尽管上面的视图代码仍然有效,但是如今有一种更简单的方法可以执行此操作。render()是与极为相似的功能render_to_response(),但它会RequestContext自动使用,而无需显式传递它:

from django.shortcuts import render

def some_view(request):
    # ...
    return render(request, 'my_template.html', my_data_dictionary)

9
有关如何将django.core.context_processors.request添加到模板上下文处理器而不覆盖默认值的信息,请参见stackoverflow.com/questions/2246725/…
里克·韦斯特拉

如果我使用HttpResponse而不是render,我仍然可以在template.I中获取session属性。我很困惑,请告诉我
cafebabe1991 2014年

@ cafebabe1991是什么意思?该HttpResponse课程根本不涉及模板,因此问题似乎不相关……
Ludwik Trammer 2014年

是的,实际上我做了一个实验,最后才意识到这一点。抱歉
cafebabe1991

18

request.session 是一个字典,就像其他字典一样,因此您只需对属性和成员使用常规模板机制:

{{ request.session.name }}

不要忘记将请求传递到模板上下文中,甚至更好地确保您正在使用RequestContext并启用了请求上下文处理器。请参阅文档


11

我正在使用Django 1.9(2016年3月),要开始{{ request.session.name}}工作,我的设置是这样的:

TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [],
    'APP_DIRS': True,
    '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',
            ],
        },
    },
]

从以前的答案的区别是:'django.core.context_processors.request'成为'django.template.context_processors.request'


2
在Django 1.10中,django.template.context_processors.request已经在设置文件中了:D
Thai Tran

6

您可以将request变量传递给模板,然后在其中使用:

{{ request.session.name }}

2

request.session.keys()然后先打印

request.session['_auth_user_id']
request.session['_auth_user_backend']

您将获得这两个会话变量。


2

最简单的实现是使用if loop:

{% if 'data' in request.session %}

1

在您的settins.py中

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.core.context_processors.request',
)

您的看法,也许像这样。

from django.shortcuts import render_to_response, render
from django.http import HttpResponse, HttpResponseRedirect
from django.template import RequestContext

@login_required()
def index_admin(request):
    return render_to_response('carteras/index_admin.html', {}, context_instance=RequestContext(request))

我还必须将django.contrib.auth.context_processors.auth添加到TEMPLATE_CONTEXT_PROCESSORS元组。
托尼

1

继续@Ludwik Trammer答案,如何添加TEMPLATE_CONTEXT_PROCESSORS

对于django 1.6,在settings.py中添加引用以下代码的TEMPLATE_CONTEXT_PROCESSORS,然后{{ request.session.name }}在模板文件中使用。

TEMPLATE_CONTEXT_PROCESSORS = ("django.contrib.auth.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
"django.core.context_processors.static",
"django.core.context_processors.tz",
"django.contrib.messages.context_processors.messages",
"django.core.context_processors.request")

参考https://docs.djangoproject.com/en/1.6/ref/settings/#std:setting-TEMPLATE_CONTEXT_PROCESSORS

请注意,您应该在设置中使用完整的代码。"django.core.context_processors.request"单独使用将导致覆盖默认设置。


0

现在可能为时已晚。如果直接设置TEMPLATE_CONTEXT_PROCESSORSsettings.py,则将丢失所有默认TEMPLATE_CONTEXT_PROCESSORS值。这是我在我的工作settings.py

from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS as DEFAULT_TEMPLATE_CONTEXT_PROCESSORS

TEMPLATE_CONTEXT_PROCESSORS = DEFAULT_TEMPLATE_CONTEXT_PROCESSORS + (
    'django.core.context_processors.request',
)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.