2010-03-31 22 views
103

Jeżeli ustawić zmienną sesji w Django, jak:Django: dostęp do zmiennych sesji z poziomu szablonu?

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

Czy istnieje sposób mogę uzyskać do niego dostęp z poziomu szablonu, czy muszę pobierać go od wewnątrz widoku, a następnie przekazać je do szablon?

Pytam, ponieważ mam około 10 małych zmiennych sesji, do których chciałbym uzyskać dostęp w szablonie, a przekazanie wszystkich 10 z widoku do szablonu może być nieco kłopotliwe.

(mam używać zmiennych sesji, ponieważ jest to HttpResponseRedirect, ale przechowywanie zmiennych w bazie danych jest przesadą dla moich celów.)

Tak - każdy sposób, aby pobrać zmienne sesji bezpośrednio w szablonie?

Odpowiedz

183

Trzeba dodać django.core.context_processors.request do template context processors. Następnie można uzyskać do nich tak:

{{ request.session.name }} 

W przypadku korzystania widoki niestandardowe upewnij się, że są przechodzącą instancji RequestContext. Przykład wzięty z documentation:

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)) 

Aktualizacja 2013: Sądząc po upvotes ja wciąż otrzymujących dla tej odpowiedzi, ludzie wciąż napotykają pomocny, ponad trzy lata po tym jak został napisany. Należy jednak pamiętać, że chociaż powyższy kod widokowy jest nadal aktualny, w dzisiejszych czasach jest o wiele prostszy sposób robienia tego. render() to funkcja bardzo podobna do render_to_response(), ale korzysta RequestContext automatycznie, bez konieczności przekazać go wyraźnie:

from django.shortcuts import render 

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

Zobacz http://stackoverflow.com/questions/2246725/django-template-context-processors#answer-9233283 dla sposobu dodawania django.core.context_processors.request do swoich procesorów szablon bez kontekstu przesłonięcie domyślne. –

+0

Jeśli używam HttpResponse zamiast renderowania, nadal będę mógł uzyskać atrybut sesji w moim szablonie. Jestem zdezorientowany, proszę powiedz mi, – cafebabe1991

+0

@ cafebabe1991 Co masz na myśli? Klasa 'HttpResponse' w ogóle nie zajmuje się szablonami, więc pytanie nie wydaje się istotne ... –

13

request.session jest słownikiem jak każdy inny, więc wystarczy użyć zwykłego mechanizmu szablonów dla atrybutów i Członków:

{{ request.session.name }} 

Nie zapomnij przekazać wniosek do kontekstu szablonu, lub nawet lepiej zapewnić, używają RequestContext i mają włączony procesor kontekstu żądania. Zobacz the documentation.

5

Możesz przekazać zmienną request do szablonu i nie używać:

{{ request.session.name }} 
1

W swojej settins.py

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.core.context_processors.request', 
) 

Państwa zdaniem, może wyglądać następująco.

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

Musiałem również dodać "django.contrib.auth.context_processors.auth" do krotki TEMPLATE_CONTEXT_PROCESSORS. – Tony

2

pierwszego wydruku request.session.keys() następnie

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

Dostaniesz te dwie zmienne sesji.

1

Continuing @Ludwik Trammer odpowiedź Jak dodać TEMPLATE_CONTEXT_PROCESSORS

Dla Django 1.6, w ustawieniach.py dodaj TEMPLATE_CONTEXT_PROCESSORS, odnoszą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") 

referencyjne https://docs.djangoproject.com/en/1.6/ref/settings/#std:setting-TEMPLATE_CONTEXT_PROCESSORS

Pls pamiętać, że należy korzystać z tego kompletny kod w ustawieniach. Samo użycie tej opcji spowoduje przesłonięcie domyślnych ustawień.

0

Może trochę za późno. Jeśli ustawisz bezpośrednio TEMPLATE_CONTEXT_PROCESSORS w settings.py, stracisz całą domyślną wartość TEMPLATE_CONTEXT_PROCESSORS. Oto, co robię w moim 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', 
) 
7

Używam Django 1.9 (marzec 2016) i dostać {{ request.session.name}} do pracy, moje ustawienia mają tę ::

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 od poprzedniego odpowiedzi jest: 'django.core.context_processors.request' stał 'django.template.context_processors.request'

+1

w Django 1.10, plik 'django.template.context_processors.request' był już w pliku ustawień: D –

Powiązane problemy