Django: dostęp do zmiennych sesji z poziomu szablonu?


134

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?

Odpowiedzi:


228

Musisz dodać django.core.context_processors.requestdo szablonu procesory kontekstu . Następnie możesz uzyskać do nich dostęp w następujący sposób:

{{ request.session.name }}

W przypadku korzystania z widoków niestandardowych upewnij się, że przekazujesz instancję RequestContext. Przykład zaczerpnięty z dokumentacji :

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 pozytywnych opiniach, które wciąż otrzymuję za tę odpowiedź, ludzie nadal uważają ją za pomocną, ponad trzy lata po pierwotnym napisaniu. Należy jednak pamiętać, że chociaż powyższy kod widoku jest nadal ważny, obecnie istnieje znacznie prostszy sposób na zrobienie tego. render()jest funkcją bardzo podobną do render_to_response(), ale używa jej RequestContextautomatycznie, bez konieczności jawnego przekazywania:

from django.shortcuts import render

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

10
Zobacz stackoverflow.com/questions/2246725/…, aby dowiedzieć się, jak dodać django.core.context_processors.request do procesorów kontekstu szablonu bez nadpisywania ustawień domyślnych.
Rick Westera

jeśli użyję HttpResponse zamiast renderowania, czy nadal będę w stanie uzyskać atrybut sesji w moim szablonie. Jestem zdezorientowany, proszę, powiedz mi
cafebabe1991

@ cafebabe1991 Co masz na myśli? HttpResponseKlasa nie radzić sobie z szablonów w ogóle, więc pytanie nie wydaje się stosowne ...
Ludwik Trammer

Tak, właściwie przeprowadziłem eksperyment, żeby na koniec to sobie uświadomić. Złe pytanie. przepraszam
cafebabe1991

18

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:

{{ request.session.name }}

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ę .


12

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'


2
w Django 1.10 django.template.context_processors.requestplik był już w pliku ustawień: D
Thai Tran


3

najprostszą implementacją jest użycie pętli if:

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

2

Pierwszy druk request.session.keys()następnie

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

Otrzymasz te dwie zmienne sesji.


1

W twoim pliku setsins.py

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

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

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

1

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.


0

Może teraz trochę za późno. Jeśli bezpośrednio ustawione TEMPLATE_CONTEXT_PROCESSORSw settings.py, stracisz wszystkie domyślne TEMPLATE_CONTEXT_PROCESSORSwartości. 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',
)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.