2010-05-23 13 views
58

Sono giunto al punto in cui ho bisogno di passare determinate variabili a tutte le mie viste (principalmente variabili di tipo di autenticazione personalizzate).creazione del mio processore di contesto in django

Mi è stato detto che scrivere il mio processore di contesto era il modo migliore per farlo, ma ho alcuni problemi.

mio file di impostazioni simile a questo

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.contrib.messages.context_processors.messages", 
    "sandbox.context_processors.say_hello", 
) 

Come potete vedere, ho un modulo chiamato 'context_processors' e una funzione all'interno di quella chiamata 'say_hello'.

che si presenta come

def say_hello(request): 
     return { 
      'say_hello':"Hello", 
     } 

Ho ragione di assumere ora posso effettuare le seguenti operazioni entro le mie opinioni?

{{ say_hello }} 

Al momento, questo non rende nulla nel mio modello.

mio punto di vista assomiglia

from django.shortcuts import render_to_response 

def test(request): 
     return render_to_response("test.html") 

risposta

41

Il processore contesto che hai scritto dovrebbe funzionare. Il problema è a tuo avviso.

Sei sicuro che la tua vista sia resa con RequestContext?

Ad esempio:

def test_view(request): 
    return render_to_response('template.html') 

La vista sopra non utilizzerà i processori di contesto di cui TEMPLATE_CONTEXT_PROCESSORS. Assicurarsi che si sta fornendo un RequestContext in questo modo:

def test_view(request): 
    return render_to_response('template.html', context_instance=RequestContext(request)) 
+1

Il 'contesto_instance' è ciò che mancava! Grazie TM – dotty

+0

Follow up, come mai ho bisogno di questo context_instance? Come mai non ho bisogno di questo se utilizzo il sistema di autenticazione di django? – dotty

+0

Le viste incorporate di Django gestiscono ciò per te (usano un 'RequestContext'). Pensa al processore di contesto che hai creato. Ci vuole 'request' come argomento. Ciò significa che devi in ​​qualche modo dare la richiesta corrente alla logica di rendering. 'RequestContext' fondamentalmente si limita a gestire la semplice logica del looping di tutti i processori di contesto e passando la richiesta corrente a loro, quindi aggiornando il contesto della pagina con i risultati. –

24

Secondo il django docs è possibile utilizzare render come scorciatoia invece di render_to_response con l'argomento context_instance:

In alternativa, utilizzare la scorciatoia render() che è lo stesso di una chiamata a render_to_response() con un argomento context_instance che forza l'uso di un RequestContext.

+0

In effetti, in questi giorni è possibile. – fabspro

2

Se stai usando render_to_response() scorciatoia di Django per compilare un modello con il contenuto di un dizionario, il modello sarà approvato un'istanza di contesto di default (non un RequestContext). Per utilizzare un RequestContext nel rendering del modello, utilizzare il collegamento render() che equivale a una chiamata a render_to_response() con un argomento context_instance che impone l'utilizzo di un RequestContext.