it-swarm.com.de

Erstellen meines eigenen Kontextprozessors in django

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

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))
49
TM.

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.

28
bpetit

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

9
andilabs

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.

2
GrvTyagi