장고에서 나만의 컨텍스트 프로세서 만들기


81

특정 변수를 모든 뷰 (대부분 사용자 지정 인증 유형 변수)에 전달해야하는 시점에 도달했습니다.

내 컨텍스트 프로세서를 작성하는 것이이를 수행하는 가장 좋은 방법이라고 들었지만 몇 가지 문제가 있습니다.

내 설정 파일은 다음과 같습니다.

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

보시다시피 'context_processors'라는 모듈과 'say_hello'라는 함수가 있습니다.

어떤 모습

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

이제 내 관점에서 다음을 수행 할 수 있다고 가정하는 것이 옳습니까?

{{ say_hello }}

지금은 내 템플릿에서 아무것도 렌더링되지 않습니다.

내 견해는

from django.shortcuts import render_to_response

def test(request):
        return render_to_response("test.html")

답변:


54

작성한 컨텍스트 프로세서가 작동해야합니다. 문제는 당신의 관점에 있습니다.

당신의 관점이 렌더되고 있다고 확신 RequestContext합니까?

예를 들면 :

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

위의보기는에 나열된 컨텍스트 프로세서를 사용하지 않습니다 TEMPLATE_CONTEXT_PROCESSORS. 다음 RequestContext과 같이 제공하는지 확인하십시오 .

def test_view(request):
    return render_to_response('template.html', context_instance=RequestContext(request))

1
'context_instance'가 누락되었습니다! 감사합니다 TM
dotty

후속 조치,이 context_instance가 왜 필요합니까? django의 인증 시스템을 사용하는 경우 어떻게 이것이 필요하지 않습니까?
dotty

1
Django의 내장 뷰가이를 처리합니다 (를 사용합니다 RequestContext). 당신이 만든 컨텍스트 프로세서에 대해 생각해보십시오. request인수로 취 합니다. 즉, 렌더링 로직에 현재 요청을 어떻게 든 제공해야합니다. RequestContext기본적으로 모든 컨텍스트 프로세서를 반복하고 현재 요청을 전달한 다음 결과로 페이지 컨텍스트를 업데이트하는 간단한 논리를 처리합니다.
TM.

컨텍스트를 요청하기 위해 내보기를 수정할 수 있습니까?
dotty

3
@TM. return render_to_response('template.html', context_instance=RequestContext(request))오래된 FASION 내가 생각이다 return render(request,'template.html')더 DRY입니다
suhailvs

29

django 문서 에 따르면 rendercontext_instance 인수를 사용하여 render_to_response 대신 바로 가기로 사용할 수 있습니다 .

또는 render()RequestContext 사용을 강제하는 context_instance 인수를 사용하여 render_to_response () 호출과 동일한 바로 가기를 사용하십시오 .


사실, 요즘에는 가능합니다.
fabspro 2014

9

Django 1.8부터 다음과 같이 사용자 정의 컨텍스트 프로세서를 등록합니다.

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

컨텍스트 프로세서가 앱 www에 있다고 가정합니다 .context_processors.py


2

Django의 render_to_response()바로 가기를 사용하여 템플릿을 사전의 콘텐츠로 채우는 경우 기본적으로 템플릿에 Context 인스턴스가 전달됩니다 (아님 RequestContext). 를 사용하려면 RequestContext템플릿 렌더링에서 사용 render()에 대한 호출과 동일한 바로 가기를 render_to_response()으로 context_instance인수하는 힘 a의 사용 RequestContext.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.