Django:从模板中访问会话变量?
如果我在Django中设置会话变量,如:Django:从模板中访问会话变量?,django,Django,如果我在Django中设置会话变量,如: request.session["name"] = "name" 是否有一种方法可以从模板中访问它,或者必须从视图中检索它,然后将其传递给模板 询问,因为我想在模板中访问大约10个小会话变量,而将所有10个变量从视图传递到模板可能会有点混乱 (我必须使用会话变量,因为它是HttpResponseRedirect,但将变量存储在数据库中对我来说太过分了。) 那么-有没有办法直接在模板中获取会话变量?请求。会话与其他任何会话一样是一个字典,因此您只需使用常
request.session["name"] = "name"
是否有一种方法可以从模板中访问它,或者必须从视图中检索它,然后将其传递给模板
询问,因为我想在模板中访问大约10个小会话变量,而将所有10个变量从视图传递到模板可能会有点混乱
(我必须使用会话变量,因为它是HttpResponseRedirect,但将变量存储在数据库中对我来说太过分了。)
那么-有没有办法直接在模板中获取会话变量?
请求。会话与其他任何会话一样是一个字典,因此您只需使用常规的属性和成员模板机制即可:
{{ request.session.name }}
不要忘记将请求传递到模板上下文中,或者更好地确保您正在使用RequestContext并启用了请求上下文处理器。请参阅。您可以将请求
变量传递到模板,然后使用:
{{ request.session.name }}
您需要添加到您的。然后您可以像这样访问它们:
{{ request.session.name }}
如果您正在使用自定义视图,请确保您正在传递RequestContext实例。示例取自:
2013年更新:从我仍然收到的关于这个答案的投票来看,人们仍然觉得它很有帮助,这比它最初编写的时间晚了三年多。但是请注意,尽管上面的视图代码仍然有效,但现在有一种更简单的方法来实现这一点。是一个非常类似于render_to_response()
的函数,但它自动使用RequestContext
,无需显式传递:
from django.shortcuts import render
def some_view(request):
# ...
return render(request, 'my_template.html', my_data_dictionary)
在你的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))
首先打印request.session.keys()
request.session['_auth_user_id']
request.session['_auth_user_backend']
您将获得这两个会话变量。继续@Ludwik Trammer解答,如何添加模板\u上下文\u处理器
对于django 1.6,在settings.py中添加引用以下代码的模板上下文处理器,然后在模板文件中使用{{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")
参考文献
请注意,您应该在设置中使用完整的代码。单独使用“django.core.context\u processors.request”
将导致覆盖默认设置。现在可能有点太晚了。如果直接在settings.py
中设置TEMPLATE\u CONTEXT\u处理器
,则会丢失所有默认的TEMPLATE\u CONTEXT\u处理器
值。以下是我在我的设置.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\u processors.request'
变成了'django.template.context\u processors.request'
最简单的实现是使用if循环:
{% if 'data' in request.session %}
有关如何在不覆盖默认值的情况下将django.core.context_processors.request添加到模板上下文处理器的信息,请参阅。如果我使用HttpResponse而不是render,我仍然能够在模板中获取会话属性。我很困惑,请告诉我me@cafebabe1991什么意思?HttpResponse
类根本不处理模板,所以这个问题似乎不相关……是的,实际上我做了一个实验,最后才意识到这一点。这个问题不好。Sorry还必须将'django.contrib.auth.context\u processors.auth'添加到TEMPLATE\u context\u processors元组中。在django 1.10中,django.TEMPLATE.context\u processors.request
已在设置文件中:D
{% if 'data' in request.session %}