Ich bin an einem Punkt angelangt, an dem ich bestimmte Variablen an alle meine Ansichten übergeben muss (meistens benutzerdefinierte Authentifizierungstypvariablen).
Mir wurde gesagt, dass das Schreiben meines eigenen Kontextprozessors der beste Weg sei, dies zu tun, aber ich habe einige Probleme.
Meine Einstellungsdatei sieht so 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 namens 'context_processors' und eine Funktion innerhalb dieses Moduls namens 'say_hello'.
Welches sieht aus wie
def say_hello(request):
return {
'say_hello':"Hello",
}
Kann ich zu Recht davon ausgehen, dass ich jetzt in meinen Ansichten Folgendes tun kann?
{{ say_hello }}
Im Moment wird in meiner Vorlage nichts angezeigt.
Meine Ansicht sieht aus wie
from django.shortcuts import render_to_response
def test(request):
return render_to_response("test.html")
quelle
RequestContext
). Denken Sie an den Kontextprozessor, den Sie erstellt haben. Es istrequest
ein Argument. Das bedeutet, dass Sie die aktuelle Anforderung irgendwie an die Renderlogik übergeben müssen.RequestContext
Im Grunde genommen wird nur die einfache Logik behandelt, alle Kontextprozessoren zu durchlaufen, die aktuelle Anforderung an sie weiterzuleiten und dann den Seitenkontext mit den Ergebnissen zu aktualisieren.return render_to_response('template.html', context_instance=RequestContext(request))
ist alte Fasion, ich denkereturn render(request,'template.html')
ist mehrGemäß den Django-Dokumenten können Sie
render
anstelle von render_to_response eine Verknüpfung mit dem Argument context_instance verwenden:quelle
Seit Django 1.8 registrieren Sie Ihre benutzerdefinierten Kontextprozessoren wie folgt:
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [ 'templates' ], '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', 'www.context_processors.instance', ], }, }, ]
Angenommen, Ihr Kontextprozessor befindet sich in der App
www
incontext_processors.py
quelle
Wenn Sie die
render_to_response()
Verknüpfung von Django verwenden , um eine Vorlage mit dem Inhalt eines Wörterbuchs zu füllen, wird Ihrer Vorlage standardmäßig eine Kontextinstanz übergeben (nicht aRequestContext
). VerwendenRequestContext
Sie zum Verwenden von a in Ihrem Vorlagen-Rendering dierender()
Verknüpfung, die einem Aufruf vonrender_to_response()
mit einemcontext_instance
Argument entspricht, das die Verwendung von a erzwingtRequestContext
.quelle