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

如果我在 Django 中设置一个会话变量,比如:

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

是否有一种方法可以从模板中访问它,或者我必须从视图中检索它,然后将它传递给模板?

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

(我必须使用会话变量,因为它是一个 HttpResponseRedirect,但是在数据库中存储变量对我来说有些过头了。)

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

113382 次浏览

request.session和其他字典一样,只是使用属性和成员的常规模板机制:

\{\{ request.session.name }}

不要忘记将请求传递到模板上下文中,或者更好地确保您正在使用 RequestContext 并启用请求上下文处理器。参见 文件

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

\{\{ request.session.name }}

你需要将 django.template.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)

在你的地盘上

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

你的风景,可能是这样的。

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))

那就先打印 request.session.keys()

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

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

继续@Ludwik Trammer 的回答,如何添加 TEMPLATE _ CONTEXT _ PROCESSORS

对于 django 1.6,在 setings.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"将导致覆盖默认设置。

现在可能有点晚了。如果直接在 settings.py中设置 TEMPLATE_CONTEXT_PROCESSORS,则会丢失所有的默认 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',
)

我正在使用 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'

最简单的实现是使用 if 循环:

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

**

这个答案适用于使用 Django 3.0及以上版本的用户

**

不需要从视图传递会话变量,因为会话存储在数据库中的 django _ session 表中。所以只需使用 return redirect('/')模拟传递没有错误的任何内容。

在 index.html 文件中:

  • 如果会话变量中只有单个数据,请使用

    \{\{ request.session.your_session_varaible_name }}

  • 如果会话变量中有多个数据(如列表) ,则可以通过

{% if 'cart_prod' in request.session %} {% for cart_products in request.session.cart_prod %}
<tr>
<td style="padding: 25px">
\{\{ cart_products }}
</td>
<tr>
{% endfor %} {% endif %}

\{\{ request.session.name _ of _ session _ key }}