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']

Ви отримаєте ці дві змінні сеансу.



1

У вашій адресі

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 в налаштуваннях.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.