tworzenie własnego procesora kontekstu w django

81

Doszedłem do punktu, w którym muszę przekazać określone zmienne do wszystkich moich widoków (głównie zmienne typu niestandardowego uwierzytelniania).

Powiedziano mi, że najlepszym sposobem na zrobienie tego jest napisanie własnego procesora kontekstu, ale mam pewne problemy.

Mój plik ustawień wygląda następująco

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

Jak widać, mam moduł o nazwie „context_processors” oraz funkcję w ramach tego o nazwie „say_hello”.

Jak wygląda

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

Czy mam rację, zakładając, że w ramach moich poglądów mogę teraz wykonać następujące czynności?

{{ say_hello }}

W tej chwili to nic nie wyświetla w moim szablonie.

Mój widok wygląda

from django.shortcuts import render_to_response

def test(request):
        return render_to_response("test.html")
rozsiany
źródło

Odpowiedzi:

54

Napisany przez Ciebie procesor kontekstu powinien działać. Twoim zdaniem problem jest.

Czy jesteś pewien, że twój widok jest przedstawiany? RequestContext ?

Na przykład:

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

Powyższy widok nie będzie używał procesorów kontekstu wymienionych w TEMPLATE_CONTEXT_PROCESSORS. Upewnij się, że dostarczasz coś RequestContextpodobnego:

def test_view(request):
    return render_to_response('template.html', context_instance=RequestContext(request))
TM.
źródło
1
Brakowało „context_instance”! Dzięki TM
dotty
Kontynuuj, dlaczego potrzebuję tego context_instance? Dlaczego nie potrzebuję tego, jeśli używam systemu autoryzacji django?
dotty
1
Widoki wbudowane w Django obsługują to za Ciebie (używają a RequestContext). Pomyśl o stworzonym przez siebie procesorze kontekstu. Przyjmuje requestjako argument. Oznacza to, że musisz w jakiś sposób przekazać bieżące żądanie logice renderowania. RequestContextpo prostu obsługuje prostą logikę przechodzenia przez wszystkie procesory kontekstu i przekazywania do nich bieżącego żądania, a następnie aktualizuje kontekst strony z wynikami.
TM.
Czy mogę zmodyfikować widok, aby zażądać kontekstu?
dotty
3
@TM. return render_to_response('template.html', context_instance=RequestContext(request))to stara fascynacja, myślę, że return render(request,'template.html')jest bardziej
SUCHA
29

Zgodnie z dokumentacją django możesz użyć renderjako skrótu zamiast render_to_response z argumentem context_instance:

Alternatywnie, użyj render()skrótu, który jest taki sam jak wywołanie render_to_response () z argumentem context_instance, który wymusza użycie elementu RequestContext.

nulse
źródło
Rzeczywiście, w dzisiejszych czasach jest to możliwe.
fabspro,
9

Od Django 1.8 rejestrujesz swoje własne procesory kontekstu w następujący sposób:

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',
            ],
        },
    },
]

zakładając, że jest w procesor kontekstowego aplikacji wwwwcontext_processors.py

andilabs
źródło
2

Jeśli używasz render_to_response()skrótu Django do zapełniania szablonu zawartością słownika, do szablonu domyślnie zostanie przekazana instancja Context (nie a RequestContext). Aby użyć a RequestContextw renderowaniu szablonu, użyj render()skrótu, który jest taki sam jak wywołanie render_to_response()z context_instanceargumentem, który wymusza użycie RequestContext.

GrvTyagi
źródło