Django: Zugriff auf Sitzungsvariablen aus einer Vorlage heraus?

133

Wenn ich eine Sitzungsvariable in Django setze, wie:

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

Gibt es eine Möglichkeit, aus einer Vorlage heraus darauf zuzugreifen, oder muss ich es aus einer Ansicht heraus abrufen und dann an eine Vorlage übergeben?

Fragen, weil ich ungefähr 10 kleine Sitzungsvariablen habe, auf die ich innerhalb einer Vorlage zugreifen möchte, und das Übergeben aller 10 aus der Ansicht an die Vorlage kann etwas chaotisch werden.

(Ich muss Sitzungsvariablen verwenden, da es sich um ein HttpResponseRedirect handelt, aber das Speichern der Variablen in einer Datenbank ist für meine Zwecke zu viel des Guten.)

Also - eine Möglichkeit, Sitzungsvariablen direkt in einer Vorlage abzurufen?

AP257
quelle

Antworten:

224

Sie müssen django.core.context_processors.requestIhren Vorlagenkontextprozessoren hinzufügen . Dann können Sie wie folgt darauf zugreifen:

{{ request.session.name }}

Wenn Sie benutzerdefinierte Ansichten verwenden, stellen Sie sicher, dass Sie eine RequestContext-Instanz übergeben. Beispiel aus der Dokumentation :

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

Update 2013: Gemessen an den positiven Stimmen, die ich immer noch für diese Antwort erhalte, finden die Leute sie immer noch hilfreich, mehr als drei Jahre nachdem sie ursprünglich geschrieben wurde. Bitte beachten Sie jedoch, dass der obige Ansichtscode zwar noch gültig ist, heutzutage jedoch eine viel einfachere Möglichkeit besteht, dies zu tun. render()ist eine Funktion, die sehr ähnlich ist render_to_response(), aber RequestContextautomatisch verwendet wird, ohne dass sie explizit übergeben werden muss:

from django.shortcuts import render

def some_view(request):
    # ...
    return render(request, 'my_template.html', my_data_dictionary)
Ludwik Trammer
quelle
9
Unter stackoverflow.com/questions/2246725/… erfahren Sie, wie Sie django.core.context_processors.request zu Ihren Vorlagenkontextprozessoren hinzufügen, ohne die Standardeinstellungen zu überschreiben.
Rick Westera
Wenn ich HttpResponse anstelle von Rendern verwende, kann ich das Sitzungsattribut weiterhin in meiner Vorlage abrufen. Ich bin verwirrt, bitte sagen Sie es mir
cafebabe1991
@ cafebabe1991 Was meinst du? Die HttpResponseKlasse befasst sich überhaupt nicht mit Vorlagen, daher scheint die Frage nicht relevant zu sein ...
Ludwik Trammer
Ja, eigentlich habe ich ein Experiment gemacht, um das am Ende zu realisieren. Schlechte Frage. Es tut uns leid
cafebabe1991
18

request.session ist ein Wörterbuch wie jedes andere, daher verwenden Sie einfach den normalen Vorlagenmechanismus für Attribute und Mitglieder:

{{ request.session.name }}

Vergessen Sie nicht, die Anforderung an den Vorlagenkontext zu übergeben, oder stellen Sie noch besser sicher, dass Sie RequestContext verwenden und den Anforderungskontextprozessor aktiviert haben. Siehe die Dokumentation .

Daniel Roseman
quelle
11

Ich verwende Django 1.9 (März 2016) und um {{ request.session.name}}zur Arbeit zu kommen, haben meine Einstellungen Folgendes:

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

Der Unterschied zu den vorherigen Antworten ist: 'django.core.context_processors.request'wurde'django.template.context_processors.request'

Lunamystry
quelle
2
in Django 1.10 war das django.template.context_processors.requestbereits in der Einstellungsdatei: D
Thai Tran
6

Sie können eine requestVariable an eine Vorlage übergeben und dort verwenden:

{{ request.session.name }}
Silbernes Licht
quelle
2

Erst request.session.keys()dann drucken

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

Sie erhalten diese beiden Sitzungsvariablen.

Namita Maharanwar
quelle
2

Die einfachste Implementierung ist die Verwendung der if-Schleife:

{% if 'data' in request.session %}
cryptoKTM
quelle
1

In Ihren Settins.py

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

Ihre Ansicht, vielleicht so aussehen.

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))
Pjl
quelle
Ich musste auch 'django.contrib.auth.context_processors.auth' zum TEMPLATE TEMPLATE_CONTEXT_PROCESSORS hinzufügen.
Tony
1

Fortsetzung der Antwort von @Ludwik Trammer: Hinzufügen von TEMPLATE_CONTEXT_PROCESSORS

Fügen Sie für django 1.6 in settings.py TEMPLATE_CONTEXT_PROCESSORS hinzu, indem Sie auf den folgenden Code verweisen, und verwenden Sie ihn dann {{ request.session.name }}in Vorlagendateien.

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

Referenz https://docs.djangoproject.com/de/1.6/ref/settings/#std:setting-TEMPLATE_CONTEXT_PROCESSORS

Bitte beachten Sie, dass Sie diesen vollständigen Code in den Einstellungen verwenden sollten. Die "django.core.context_processors.request"alleinige Verwendung führt dazu, dass die Standardeinstellungen überschrieben werden.

Sree
quelle
0

Vielleicht jetzt etwas zu spät. Wenn Sie direkt gesetzt TEMPLATE_CONTEXT_PROCESSORSin settings.py, erhalten Sie alle Standard verlieren TEMPLATE_CONTEXT_PROCESSORSWert. Folgendes mache ich in meinem 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',
)
rabbit.aaron
quelle