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 ist, 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",
}
Bin ich zu Recht davon ausgegangen, dass ich in meinen Ansichten jetzt Folgendes tun kann?
{{ say_hello }}
Im Moment wird dies in meiner Vorlage zu nichts.
Meine Ansicht sieht so aus
from Django.shortcuts import render_to_response
def test(request):
return render_to_response("test.html")
Der von Ihnen geschriebene Kontextprozessor sollte funktionieren. Das Problem ist aus Ihrer Sicht.
Sind Sie sicher, dass Ihre Ansicht mit RequestContext
gerendert wird?
Beispielsweise:
def test_view(request):
return render_to_response('template.html')
In der obigen Ansicht werden die in TEMPLATE_CONTEXT_PROCESSORS
Aufgelisteten Kontextprozessoren nicht verwendet. Stellen Sie sicher, dass Sie ein RequestContext
wie folgt angeben:
def test_view(request):
return render_to_response('template.html', context_instance=RequestContext(request))
Gemäß Django docs können Sie render
als Verknüpfung anstelle von render_to_response mit dem Argument context_instance verwenden:
Verwenden Sie alternativ die Verknüpfung
render()
, die dem Aufruf von render_to_response () mit einem context_instance-Argument entspricht, das die Verwendung eines RequestContext erzwingt.
Seit Django 1.8 registrieren Sie Ihre benutzerdefinierten Kontextprozessoren folgendermaßen:
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 App www
in context_processors.py
Wenn Sie die Verknüpfung render_to_response()
von Django verwenden, um eine Vorlage mit dem Inhalt eines Wörterbuchs zu füllen, wird Ihrer Vorlage standardmäßig eine Kontextinstanz übergeben (keine RequestContext
). Um ein RequestContext
in Ihrem Template-Rendering zu verwenden, verwenden Sie die Verknüpfung render()
, die dem Aufruf von render_to_response()
mit einem erzwungenen context_instance
- Argument entspricht die Verwendung eines RequestContext
.