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

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

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.


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


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.