Django: accedere alle variabili di sessione da un modello?


133

Se imposto una variabile di sessione in Django, come:

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

Esiste un modo per accedervi dall'interno di un modello o devo recuperarlo dall'interno di una vista e quindi passarlo a un modello?

Chiedere perché ho circa 10 piccole variabili di sessione a cui vorrei accedere all'interno di un modello e passare tutti i 10 dalla vista al modello potrebbe diventare un po 'confuso.

(Devo usare le variabili di sessione perché è un HttpResponseRedirect, ma la memorizzazione delle variabili in un database è eccessiva per i miei scopi.)

Quindi - un modo per afferrare le variabili di sessione direttamente all'interno di un modello?

Risposte:


224

È necessario aggiungere django.core.context_processors.requestai processori di contesto del modello . Quindi puoi accedervi in ​​questo modo:

{{ request.session.name }}

Nel caso in cui si utilizzino viste personalizzate, assicurarsi di passare un'istanza RequestContext. Esempio tratto dalla documentazione :

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

Aggiornamento 2013: a giudicare dai voti che sto ancora ricevendo per questa risposta, le persone lo stanno ancora trovando utile, più di tre anni dopo che è stato originariamente scritto. Si noti tuttavia che sebbene il codice di visualizzazione sopra sia ancora valido, al giorno d'oggi esiste un modo molto più semplice di farlo. render()è una funzione molto simile render_to_response(), ma utilizza RequestContextautomaticamente, senza la necessità di passarla esplicitamente:

from django.shortcuts import render

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

9
Vedere stackoverflow.com/questions/2246725/… per come aggiungere django.core.context_processors.request ai processori di contesto del modello senza sovrascrivere i valori predefiniti.
Rick Westera,

se uso HttpResponse invece di render sarò ancora in grado di ottenere l'attributo di sessione nel mio modello. Sono confuso, per favore, dimmelo
cafebabe1991,

@ cafebabe1991 Che vuoi dire? La HttpResponseclasse non tratta affatto i template, quindi la domanda non sembra rilevante ...
Ludwik Trammer

Ya, in realtà ho fatto un esperimento per rendermene conto alla fine. scusa
cafebabe1991

18

request.session è un dizionario come un altro, quindi basta usare il normale meccanismo di template per attributi e membri:

{{ request.session.name }}

Non dimenticare di passare la richiesta nel contesto del modello, o ancora meglio assicurarti di utilizzare RequestContext e di abilitare il processore di contesto della richiesta. Vedere la documentazione .


11

Sto usando Django 1.9 (marzo 2016) e per mettermi {{ request.session.name}}al lavoro, le mie impostazioni hanno questo ::

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

La differenza rispetto alle risposte precedenti è: è 'django.core.context_processors.request'diventato'django.template.context_processors.request'


2
in Django 1.10, django.template.context_processors.requestera già nel file di impostazione: D
Thai Tran

6

È possibile passare una requestvariabile a un modello e lì utilizzare:

{{ request.session.name }}

2

Prima stampa request.session.keys()quindi

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

Otterrai queste due variabili di sessione.


2

l'implementazione più semplice sta usando if loop:

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

1

Nel tuo settins.py

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

Il tuo punto di vista, forse assomiglia a questo.

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

Ho anche dovuto aggiungere 'django.contrib.auth.context_processors.auth' alla tupla TEMPLATE_CONTEXT_PROCESSORS.
Tony,

1

Continuando la risposta di @Ludwik Trammer, Come aggiungere TEMPLATE_CONTEXT_PROCESSORS

Per django 1.6, in settings.py aggiungere TEMPLATE_CONTEXT_PROCESSORS facendo riferimento al codice seguente e quindi utilizzarlo {{ request.session.name }}nei file modello.

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

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

Si noti che, è necessario utilizzare quel codice completo nelle impostazioni. L'uso da "django.core.context_processors.request"solo comporterà l'override delle impostazioni predefinite.


0

Forse un po 'troppo tardi ora. Se si imposta direttamente TEMPLATE_CONTEXT_PROCESSORSin settings.py, si perderanno tutti di default TEMPLATE_CONTEXT_PROCESSORSil valore. Ecco cosa faccio nel mio 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',
)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.