2010-03-31 24 views
103

Se ho impostato una variabile di sessione in Django, come:Django: accede alle variabili di sessione da un modello?

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

C'è un modo per accedere all'interno di un modello, o devo recuperare dall'interno una visione, e poi 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 e 10 dalla vista al modello potrebbe diventare un po 'disordinato.

(devo usare le variabili di sessione perché è un HttpResponseRedirect, ma memorizzare le variabili in un database è eccessivo per i miei scopi.)

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

risposta

183

è necessario aggiungere al vostro django.core.context_processors.requesttemplate context processors. Poi si può accedere in questo modo:

{{ request.session.name }} 

Nel caso in cui si utilizza visualizzazioni personalizzate assicurarsi che si sta passando un'istanza RequestContext. Esempio tratto da 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)) 

Aggiornamento 2013: A giudicare dalle upvotes Sto ancora che ricevono per questa risposta, le persone sono ancora trovare utile, più di tre anni dopo che è stato scritto in origine. Si noti tuttavia che sebbene il codice di visualizzazione sopra sia ancora valido, al giorno d'oggi c'è un modo molto più semplice per farlo. render() è una funzione molto simile a render_to_response(), ma utilizza RequestContext automaticamente, senza bisogno di passare in modo esplicito:

from django.shortcuts import render 

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

Vedi http://stackoverflow.com/questions/2246725/django-template-context-processors#answer-9233283 per sapere come aggiungere django.core.context_processors.request ai tuoi processori contesto modello senza ignorando il impostazioni predefinite. –

+0

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

+0

@ cafebabe1991 Cosa intendi? La classe 'HttpResponse' non ha nulla a che fare con i template, quindi la domanda non sembra rilevante ... –

13

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

{{ request.session.name }} 

Non dimenticate di passare la richiesta nel contesto del modello, o meglio ancora si assicurare stanno usando RequestContext e hanno il processore di contesto della richiesta abilitato. Vedi the documentation.

5

È possibile passare una variabile request a un modello e ci usare:

{{ request.session.name }} 
1

Nella tua settins.py

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

tuo punto di vista, forse simile a questa.

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

Ho anche dovuto aggiungere "django.contrib.auth.context_processors.auth" alla tupla TEMPLATE_CONTEXT_PROCESSORS. – Tony

2

prima stampa request.session.keys() poi

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

Otterrete queste due variabili di sessione.

1

Continua @Ludwik Trammer risposta, Come aggiungere TEMPLATE_CONTEXT_PROCESSORS

per Django 1.6, in impostazioni.py aggiungi TEMPLATE_CONTEXT_PROCESSORS facendo riferimento al codice sottostante e quindi usa {{ 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

nota di Pls che, si dovrebbe utilizzare tale codice completo nelle impostazioni. L'utilizzo di "django.core.context_processors.request" da solo comporterà l'override delle impostazioni predefinite.

0

Forse un po 'troppo tardi ora. Se si imposta direttamente TEMPLATE_CONTEXT_PROCESSORS in settings.py, si perderà tutto il valore predefinito TEMPLATE_CONTEXT_PROCESSORS. Ecco quello che 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', 
) 
7

Sto usando Django 1.9 (Marzo 2016) e per ottenere {{ 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 al precedente risposte è: 'django.core.context_processors.request' divenne 'django.template.context_processors.request'

+1

in Django 1.10, il file 'django.template.context_processors.request' era già nel file delle impostazioni: D –

Problemi correlati