Django: доступ к переменным сеанса из шаблона? - PullRequest
120 голосов
/ 31 марта 2010

Если я установлю переменную сеанса в Django, например:

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

Есть ли способ получить к нему доступ из шаблона или мне нужно извлечь его из представления, а затем передать его в шаблон?

Спрашиваю, потому что у меня есть около 10 маленьких переменных сеанса, к которым я бы хотел обратиться в шаблоне, и передача всех 10 из представления в шаблон может стать немного беспорядочной.

(Я должен использовать переменные сеанса, потому что это HttpResponseRedirect, но хранение переменных в базе данных для меня излишне.)

Итак, есть ли способ получить переменные сеанса непосредственно в шаблоне?

Ответы [ 9 ]

201 голосов
/ 31 марта 2010

Вам необходимо добавить 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)
16 голосов
/ 31 марта 2010

request.session словарь, как и любой другой, поэтому вы просто используете обычный шаблонный механизм для атрибутов и членов:

{{ request.session.name }}

Не забудьте передать запрос в контекст шаблона, или даже лучше убедиться, что вы используете RequestContext и у вас включен обработчик контекста запроса. См. документацию .

9 голосов
/ 20 марта 2016

Я использую Django 1.9 (март 2016 г.) и чтобы заставить {{ 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'

6 голосов
/ 31 марта 2010

Вы можете передать переменную request в шаблон и там использовать:

{{ request.session.name }}
2 голосов
/ 26 апреля 2018

простейшая реализация использует цикл if:

{% if 'data' in request.session %}
2 голосов
/ 24 мая 2014

Сначала напечатайте request.session.keys(), затем

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

Вы получите эти две переменные сеанса.

1 голос
/ 05 ноября 2014

Продолжение ответа @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" приведет к переопределению настроек по умолчанию.

1 голос
/ 26 апреля 2013

В вашем местожительстве.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))
0 голосов
/ 16 января 2015

Может быть, уже слишком поздно. Если вы прямо установите 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',
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...