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

AP2*_*257 125 django

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

request.session["name"] = "name"
Run Code Online (Sandbox Code Playgroud)

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

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

(我必须使用会话变量,因为它是一个HttpResponseRedirect,但是为了我的目的,将变量存储在数据库中是过度的.)

那么 - 任何直接在模板中获取会话变量的方法?

Lud*_*mer 214

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

{{ request.session.name }}
Run Code Online (Sandbox Code Playgroud)

如果您使用自定义视图,请确保传递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))
Run Code Online (Sandbox Code Playgroud)

更新2013:从我仍然收到的这个答案的评价来看,人们仍然觉得它有用,在它最初编写三年多之后.但请注意,尽管上面的视图代码仍然有效,但现在有一种更简单的方法可以做到这一点.render()是一个非常类似的函数render_to_response(),但它RequestContext自动使用,无需显式传递:

from django.shortcuts import render

def some_view(request):
    # ...
    return render(request, 'my_template.html', my_data_dictionary)
Run Code Online (Sandbox Code Playgroud)

  • 有关如何将django.core.context_processors.request添加到模板上下文处理器而不覆盖默认值,请参见http://stackoverflow.com/questions/2246725/django-template-context-processors#answer-9233283. (9认同)

Dan*_*man 17

request.session 是一个像任何其他字典,所以你只需使用正常的模板机制的属性和成员:

{{ request.session.name }}
Run Code Online (Sandbox Code Playgroud)

不要忘记将请求传递到模板上下文中,或者甚至更好地确保使用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',
            ],
        },
    },
]
Run Code Online (Sandbox Code Playgroud)

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

  • 在Django 1.10中,`django.template.context_processors.request`已经在设置文件:D中 (2认同)

cry*_*KTM 9

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

{% if 'data' in request.session %}
Run Code Online (Sandbox Code Playgroud)


Sil*_*ght 6

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

{{ request.session.name }}
Run Code Online (Sandbox Code Playgroud)