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")
źródło
RequestContext
). Pomyśl o stworzonym przez siebie procesorze kontekstu. Przyjmujerequest
jako argument. Oznacza to, że musisz w jakiś sposób przekazać bieżące żądanie logice renderowania.RequestContext
po 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.return render_to_response('template.html', context_instance=RequestContext(request))
to stara fascynacja, myślę, żereturn render(request,'template.html')
jest bardziejZgodnie z dokumentacją django możesz użyć
render
jako skrótu zamiast render_to_response z argumentem context_instance:źródło
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
www
wcontext_processors.py
źródło
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 aRequestContext
). Aby użyć aRequestContext
w renderowaniu szablonu, użyjrender()
skrótu, który jest taki sam jak wywołanierender_to_response()
zcontext_instance
argumentem, który wymusza użycieRequestContext
.źródło