Jeśli ustawię zmienną sesyjną w Django, na przykład:
request.session["name"] = "name"
Czy istnieje sposób, aby uzyskać do niego dostęp z poziomu szablonu, czy też muszę go pobrać z widoku, a następnie przekazać do szablonu?
Pytanie, ponieważ mam około 10 małych zmiennych sesyjnych, do których chciałbym uzyskać dostęp w szablonie, i przekazanie wszystkich 10 z widoku do szablonu może być trochę nieuporządkowane.
(Muszę używać zmiennych sesji, ponieważ jest to HttpResponseRedirect, ale przechowywanie zmiennych w bazie danych jest przesadą do moich celów).
A więc - jakikolwiek sposób na pobranie zmiennych sesji bezpośrednio w szablonie?
HttpResponse
Klasa nie radzić sobie z szablonów w ogóle, więc pytanie nie wydaje się stosowne ...request.session
jest słownikiem jak każdy inny, więc po prostu używasz normalnego mechanizmu szablonów dla atrybutów i członków:Nie zapomnij przekazać żądania do kontekstu szablonu, a nawet lepiej upewnij się, że używasz RequestContext i masz włączony procesor kontekstu żądania. Zobacz dokumentację .
źródło
Używam Django 1.9 (marzec 2016) i aby zabrać się
{{ request.session.name}}
do pracy, moje ustawienia mają to: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', ], }, }, ]
Różnica w stosunku do poprzednich odpowiedzi jest następująca:
'django.core.context_processors.request'
stał się'django.template.context_processors.request'
źródło
django.template.context_processors.request
plik był już w pliku ustawień: DMożesz przekazać
request
zmienną do szablonu i tam użyć:źródło
najprostszą implementacją jest użycie pętli if:
{% if 'data' in request.session %}
źródło
Pierwszy druk
request.session.keys()
następnierequest.session['_auth_user_id'] request.session['_auth_user_backend']
Otrzymasz te dwie zmienne sesji.
źródło
W twoim pliku setsins.py
Twój widok może wyglądać tak.
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))
źródło
Kontynuacja odpowiedzi @Ludwik Trammer, Jak dodać TEMPLATE_CONTEXT_PROCESSORS
Dla django 1.6, w settings.py dodaj TEMPLATE_CONTEXT_PROCESSORS odwołując się do poniższego kodu, a następnie użyj
{{ request.session.name }}
w plikach szablonów.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")
Odniesienie https://docs.djangoproject.com/en/1.6/ref/settings/#std:setting-TEMPLATE_CONTEXT_PROCESSORS
Pls pamiętaj, że powinieneś użyć tego pełnego kodu w ustawieniach. Samo użycie
"django.core.context_processors.request"
spowoduje zastąpienie ustawień domyślnych.źródło
Może teraz trochę za późno. Jeśli bezpośrednio ustawione
TEMPLATE_CONTEXT_PROCESSORS
wsettings.py
, stracisz wszystkie domyślneTEMPLATE_CONTEXT_PROCESSORS
wartości. Oto, co robię w moimsettings.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', )
źródło