2010-02-22 7 views
2

죄송합니다 또는 혼란스러운 제목! 실제로 소리보다 훨씬 간단합니다.Django 템플릿 컨텍스트 기능이 자동으로 실행되지 않고

나는 함수있어 : 나는 템플릿에서 해당 함수를 호출 할 수 있도록하려면

def get_messages(request): 
    # do something expensive with the request 
    return 'string' 

을, 그래서 상황에 맞는 프로세서에 묶여했습니다 그래서

def context_processor(request): 
    return {'messages':get_messages(request)} 

이제 내 템플릿에 {{messages}}이 있으면 string이 출력됩니다. 큰.

문제는 get_messages이 상당히 비싸며 항상 필요한 것은 아닙니다. 템플릿의 절반 이하가 필요합니다. 함수를 템플릿에 전달하고 실행 여부에 관계없이 템플릿에 남겨 둘 수있는 방법이 있습니까?

def context_processor(request): 
    return {'messages':get_messages} 

을하지만 단지 그것을 실행하는 대신 템플릿의 기능을 설명 <function get_messages at 0x23e97d0>를 출력합니다

는 이미이 시도.

답변

3

나는 응용 프로그램의 논리를 템플릿 (MVC 패턴의보기)과 혼합해서는 안된다고 생각합니다. 이로 인해 아키텍처가 일관성을 잃습니다. 보기가 필요하면 get_messages으로 전화하여 messages을 템플릿 컨텍스트에 전달하고, 나머지는 None을 전달하면됩니다.

하지만 질문에 대답하십시오. 프록시 개체를 만들 수 있습니다. 예컨대 :

class Proxy(object): 
    def __init__(self, request) 
     self.request = request 
     super(Proxy, self).__init__() 

    def get_messages(self): 
     # so some expensive things 
     return 'string' 

# context processor 
def context_processor(request): 
    return {'messages':Proxy(request)} 

# in the view 
{{ messages.get_messages }} 

이 이제까지보다 일반적인 확인하고 하나의 방법이있다 프록시 클래스를 생성 (예를 들어, get), 그리고 생성자에서 하나 개의 매개 변수를 취 할 수 있습니다 첫 번째 매개 변수로 요청 객체를받는 함수를. 이렇게하면 템플릿에서 함수 호출을 프록시하기위한 일반적인 방법을 얻을 수 있습니다. 여기있다 :

class Proxy(object): 
    def __init__(self, request, function) 
     self.request = request 
     self.function = function 
     super(Proxy, self).__init__() 

    def get(self): 
     return self.function(self.request) 

후 당신은 쿨러 작성할 수 있습니다 전에 작성했던 것보다 : 잠겨있는 담배를하면서

# context processor 
def context_processor(request): 
    return {'messages':Proxy(request, get_messages)} 

# sounds nice to me 
{{ messages.get }} 
+1

이 솔루션은 밖에 나에게 발생했습니다. 아닙니다. 나는 신용을 얻고 있지만, 나는 완전히 동의합니다. 사용 가능한 최상의 솔루션처럼 보입니다! – Oli