Django: Session-Variable in Template(HTML-Seite) anzeigen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Piet Lotus
User
Beiträge: 80
Registriert: Dienstag 14. November 2006, 10:40

Mittwoch 2. Januar 2008, 23:14

Hallo Django-Kenner,
ich würde gerne direkt auf den Inhalt einer Session-Variable in einer Template-Datei, also der HTML-Seite zugreifen. Geht das? Ich nutze die Django-Version 0.96 und dachte z.B. an folgendes:

In einer view.py-Methode: setzt request.session['artikel'] = 'blaue Schwalbe '
In einer template-Datei: Zugriff auf die Variable über {{ artikel }} oder {{ session.artikel }} um den Inhalt an ensprechender Stelle anzuzeigen.

Mir ist es aber so nicht gelungen den Inhalt anzeigen zu lassen! Erst, wenn ich den Inhalt der Session in einen context übergebe und diesen zum Rendern der Seite benutze kann ich den Inhalt der Session-Variable anzeigen lassen...also render_to_response('seite.html', {'artikel': request.session['artikel'] })
Kann man also den Inhalt von Session-Variablen nicht direkt in Template, bzw. HTML-Seiten benutzen?
Besten Dank schon mal,
Piet
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 3. Januar 2008, 01:01

Piet Lotus hat geschrieben:Kann man also den Inhalt von Session-Variablen nicht direkt in Template, bzw. HTML-Seiten benutzen?
So weit ich weiß - nein (zumindest nicht ohne etwas hacken). Was du aber machen kannst ist das gesamte Session-Objekt zu übergeben, und dann auf ``{{ session.artikel }}`` zugreifst.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Donnerstag 3. Januar 2008, 11:23

Ich würde vorschlagen, einen eigenen context processor einzusetzen, der die Variable "session" in alle Templates zur Verfügung stellt:

Code: Alles auswählen

# proj/app/context_processors.py
def session(request):
    return {'session': request.session}

# settings.py
...
TEMPLATE_CONTEXT_PROCESSORS = (
    'django.core.context_processors.auth',
    'django.core.context_processors.debug',
    'django.core.context_processors.i18n',
    'django.core.context_processors.media',
    'proj.app.context_processors.session', # NEU
)
...

# proj/app/views.py
def index(request):
    ...
    return render_to_response('template', RequestContext(request, dict))
Aus einem mir nicht ganz erfindlichen Grund, kopiert "startproject" NICHT die Liste der TEMPLATE_CONTEXT_PROCESSORS, so wie es z.B. für MIDDLEWARE_CLASSES passiert. Daher ist ist dieses praktische Feature nicht so sichtbar und wird gerne übersehen.

Stefan
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 3. Januar 2008, 11:41

Zu bemerken ist an dieser Stelle, dass die Context-Processors nur mit dem RequestContext funktionieren. Da bin ich schon mal drauf reingefallen, der normale Context tut nicht.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Piet Lotus
User
Beiträge: 80
Registriert: Dienstag 14. November 2006, 10:40

Donnerstag 3. Januar 2008, 20:24

Danke, für die Hilfe... :D
Ich werde beide Vorschläge mal ausprobieren...
Schöne Grüße,
Piet
killercup
User
Beiträge: 16
Registriert: Mittwoch 19. Dezember 2007, 15:58

Sonntag 6. Januar 2008, 22:14

Eine andere Lösung:

Es gibt auch von Django selbst den Template-Context-Processor "django.core.context_processors.request", welcher den gesamten Request im Template verfügbar macht. Einmal hinzufügen und mittels request.session auf deine Session zugreifen.
Antworten