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

时间:2010-03-31 10:03:20

标签: django

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

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

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

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

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

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

11 个答案:

答案 0 :(得分:200)

您需要将django.core.context_processors.request添加到template context processors。然后你可以像这样访问它们:

{{ request.session.name }}

如果您使用自定义视图,请确保传递RequestContext实例。取自documentation的示例:

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)

答案 1 :(得分:16)

request.session是一个与其他字典一样的字典,因此您只需使用普通的模板机制来处理属性和成员:

{{ request.session.name }}

不要忘记将请求传递到模板上下文中,或者甚至更好地确保使用RequestContext并启用请求上下文处理器。请参阅the documentation

答案 2 :(得分:9)

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

答案 3 :(得分:6)

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

{{ request.session.name }}

答案 4 :(得分:2)

首先打印request.session.keys()然后

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

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

答案 5 :(得分:2)

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

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

答案 6 :(得分:1)

在你的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))

答案 7 :(得分:1)

继续@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"将导致覆盖默认设置。

答案 8 :(得分:0)

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

答案 9 :(得分:0)

**

此答案适用于使用 Django 3.0 及更高版本的用户

**

您不需要从视图传递会话变量,因为会话存储在数据库的 django_sessions 表中。所以只需使用 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 %}

答案 10 :(得分:-1)

{{ request.session.name_of_session_key }}