Erstellen meines eigenen Kontextprozessors in Django

81

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")
dotty
quelle

Antworten:

54

Der von Ihnen geschriebene Kontextprozessor sollte funktionieren. Das Problem liegt in Ihrer Sicht.

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

Zum Beispiel:

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

In der obigen Ansicht werden die in aufgelisteten Kontextprozessoren nicht verwendet TEMPLATE_CONTEXT_PROCESSORS. Stellen Sie sicher, dass Sie ein RequestContextähnliches Produkt liefern :

def test_view(request):
    return render_to_response('template.html', context_instance=RequestContext(request))
TM.
quelle
1
Die 'context_instance' hat gefehlt! Danke TM
dotty
Follow-up, warum brauche ich diese context_instance? Wie kommt es, dass ich das nicht brauche, wenn ich das Authentifizierungssystem von Django verwende?
Dotty
1
Die in Django integrierten Ansichten übernehmen dies für Sie (sie verwenden a RequestContext). Denken Sie an den Kontextprozessor, den Sie erstellt haben. Es ist requestein Argument. Das bedeutet, dass Sie die aktuelle Anforderung irgendwie an die Renderlogik übergeben müssen. RequestContextIm 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.
TM.
Könnte ich meine Ansicht ändern, um den Kontext anzufordern?
Dotty
3
@ TM. return render_to_response('template.html', context_instance=RequestContext(request))ist alte Fasion, ich denke return render(request,'template.html')ist mehr
trocken
29

Gemäß den Django-Dokumenten können Sie renderanstelle von render_to_response eine Verknüpfung mit dem Argument context_instance verwenden:

Verwenden Sie alternativ die render()Verknüpfung, die mit einem Aufruf von render_to_response () identisch ist, mit einem context_instance-Argument, das die Verwendung eines RequestContext erzwingt.

Nulse
quelle
In der Tat ist dies heutzutage möglich.
Fabspro
9

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 wwwincontext_processors.py

Andilabs
quelle
2

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 a RequestContext). Verwenden RequestContextSie zum Verwenden von a in Ihrem Vorlagen-Rendering die render()Verknüpfung, die einem Aufruf von render_to_response()mit einem context_instanceArgument entspricht, das die Verwendung von a erzwingt RequestContext.

GrvTyagi
quelle