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


133

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

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

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

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

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

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

Ответы:


224

Вам нужно добавить 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)

9
См stackoverflow.com/questions/2246725/... о том , как добавить django.core.context_processors.request в шаблон контекста процессора без переопределения значения по умолчанию.
Рик Вестера

Если я использую HttpResponse вместо рендеринга, смогу ли я получить атрибут сеанса в моем шаблоне. Я запутался, пожалуйста, скажите мне
cafebabe1991

@ cafebabe1991 Что ты имеешь в виду? HttpResponseКласс не имеет дело с шаблонами на всех, так что вопрос не представляется актуальной ...
Людвик трамвайщик

Да, на самом деле я провел эксперимент, чтобы понять это в конце. Плохой вопрос. извините
cafebabe1991

18

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

{{ request.session.name }}

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


11

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


2
в Django 1.10 django.template.context_processors.requestон уже был в файле настроек: D
Thai Tran


2

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

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

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


2

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

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

1

В вашем файле setins.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))

Мне также пришлось добавить django.contrib.auth.context_processors.auth в кортеж TEMPLATE_CONTEXT_PROCESSORS.
Тони

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


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',
)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.