Django的:从模板内访问会话variables?
如果我在Django中设置一个会话variables,如:
request.session["name"] = "name"
有没有一种方法可以从模板中访问它,还是必须从视图中检索它,然后将其传递给模板?
因为我有大约10个小的会话variables,我想在一个模板中访问,并将所有10从视图传递到模板可能会有点混乱。
(我必须使用会话variables,因为它是一个HttpResponseRedirect,但存储在数据库中的variables是为我的目的矫枉过正。)
所以 – 任何方式直接在模板中获取会话variables?
您需要将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)
request.session
是一个类似任何其他字典,所以你只需要使用普通的模板机制的属性和成员:
{{ request.session.name }}
不要忘记将请求传递到模板上下文,或者甚至更好地确保您正在使用RequestContext并启用请求上下文处理器。 请参阅文档 。
我正在使用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'
您可以将一个request
variables传递给一个模板,然后使用:
{{ request.session.name }}
首先打印request.session.keys()
然后
request.session['_auth_user_id'] request.session['_auth_user_backend']
你将得到这两个会话variables。
在你的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))
继续@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"
会导致覆盖默认设置。
也许现在有点晚了。 如果直接在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', )