Django: доступ к переменным сеанса из шаблона?

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

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

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

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

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

Итак - любой способ захватить переменные сеанса непосредственно внутри шаблона?

Ответ 1

Вам нужно добавить 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: Судя по upvotes, я все еще получаю за этот ответ, люди все еще находят это полезным, более чем через три года после того, как он был изначально написан. Обратите внимание, однако, что хотя приведенный выше код обзора по-прежнему действителен, в настоящее время существует гораздо более простой способ сделать это. render() - это функция, очень похожая на render_to_response(), но она использует RequestContext автоматически, без необходимости передавать ее явно:

from django.shortcuts import render

def some_view(request):
    # ...
    return render(request, 'my_template.html', my_data_dictionary)

Ответ 2

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

{{ request.session.name }}

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

Ответ 3

Я использую 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'

Ответ 4

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

{{ request.session.name }}

Ответ 5

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

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

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

Ответ 6

В папке 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

Продолжение ответа @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

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