2010-05-23 11 views
58

Ich bin an einen Punkt gekommen, an dem ich bestimmte Variablen an alle meine Ansichten übergeben muss (meist benutzerdefinierte Authentifizierungstypvariablen).Erstellen eines eigenen Kontextprozessors in Django

Ich wurde gesagt, meinen eigenen Kontext-Prozessor zu schreiben war der beste Weg, dies zu tun, aber ich habe einige Probleme.

Meine Einstellungen Datei sieht wie folgt aus

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

Wie Sie sehen können, habe ich ein Modul ‚context_processors‘ und eine Funktion innerhalb der genannten ‚say_hello‘ genannt.

Welche sieht aus wie

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

Habe ich recht ich jetzt davon ausgehen, kann die folgende in meinen Ansichten zu tun?

{{ say_hello }} 

Im Moment macht dies nichts in meiner Vorlage.

Meine Ansicht sieht aus wie

from django.shortcuts import render_to_response 

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

Antwort

41

Der Kontext Prozessor Sie geschrieben haben, funktionieren sollte. Das Problem ist Ihrer Meinung nach.

Sind Sie sicher, dass Ihre Ansicht mit RequestContext gerendert wird?

Zum Beispiel:

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

Der Blick oben wird nicht die Kontext-Prozessoren in TEMPLATE_CONTEXT_PROCESSORS aufgeführt sind. Stellen Sie sicher, dass Sie liefern ein RequestContext wie so:

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

Die 'context_instance' ist was fehlte! Danke TM – dotty

+0

Follow-up, wie kommt es, dass ich diese context_instance brauche? Wieso brauche ich das nicht, wenn ich das Auth-System von Django benutze? – dotty

+0

Djangos integrierte Ansichten behandeln dies für Sie (sie verwenden einen 'RequestContext'). Denken Sie an den Kontextprozessor, den Sie erstellt haben. Es nimmt "Anfrage" als Argument. Das bedeutet, dass Sie die aktuelle Anfrage irgendwie an die Rendering-Logik übergeben müssen. 'RequestContext' behandelt im Grunde nur die einfache Logik des Durchschleifens aller Kontextprozessoren und das Übergeben der aktuellen Anfrage an sie, dann das Aktualisieren des Seitenkontexts mit den Ergebnissen. –

24

Nach dem django docs Sie render als Verknüpfung statt render_to_response mit dem context_instance Argument verwenden:

Alternativ, die die render() Verknüpfung zu verwenden ist Dasselbe wie ein Aufruf von render_to_response() mit einem context_instance-Argument, das die Verwendung eines RequestContext erzwingt.

+0

In der Tat ist das heutzutage möglich. – fabspro

2

Wenn Sie mit Djangos render_to_response() Verknüpfung eine Vorlage mit dem Inhalt eines Wörterbuchs zu füllen, die Vorlage wird eine Context-Instanz standardmäßig übergeben werden (keine RequestContext). Um ein RequestContext in Ihrem Vorlage-Rendering zu verwenden, verwenden Sie die render() Verknüpfung, die das gleiche wie ein Aufruf an render_to_response() mit einem context_instance Argument ist, das die Verwendung eines RequestContext erzwingt.

Verwandte Themen