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'

您可以将一个requestvariables传递给一个模板,然后使用:

 {{ 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', )