2011-04-10 7 views
2

면책 조항 : 이것은 my previous question의 질문 사항입니다.django의 템플릿 태그 내에서 템플릿의 렌더링 된 출력을 얻으려면 어떻게해야합니까?

Django에 템플릿 태그를 작성하려고하는데, Mako 템플릿의 본문 내에서 렌더링됩니다. 이것이 성취 할 수 있을지 확신 할 수는 없지만 내 프로젝트와 Django 내에서 Mako Templates를 사용하는 많은 사람들에게 매우 유용 할 것입니다. 파서 객체가이 시점까지 전체 트리를 렌더링 할 수있는

def extends_mako(parser, token): 
    # wishlist below, this code does not work but it's what I want to achieve 
    template_html = '' 
    while (node = parser.nodelist.pop()): 
     template_html += node.render() 

가 : 여기

내 태그의 정의는? 내 유일한 생각은 파서 개체를 사용하여이 노드 앞에있는 모든 노드를 렌더링 (및 트리에서 제거)하는 것입니다. 그런 다음 Mako에 출력을 전달하여 HTML로 렌더링 한 다음이를 정의하는 노드의 렌더링 함수에 출력으로 사용합니다. 내 희망은, 템플릿에서 render가 호출 될 때 템플릿 태그는 이미 다른 모든 것들에 대한 편집을 완료 했으므로이 노드를 렌더링하면됩니다. 의도는 트리의 마지막 태그로 extends_mako 태그를 갖는 것입니다.

빠른 pdb.set_trace 조사를 해봤지만 지금까지는 도움이되는 내용을 볼 수 없습니다.

그래서; 템플릿 태그에 전달 된 파서 개체를 사용하여 템플릿을 컴파일하고 최종 렌더링 된 출력을 검색 할 수 있습니까?

+0

삭제 Mako 태그가 포함 된 편집. 이 질문에 대한 대답은 마코를 포함하지 않습니다. django 템플릿 태그를 사용하여 현재 장고 템플릿의 총 출력을 렌더링하는 방법은 명시 적입니다. –

답변

1

이것은 특정 문제에 대한 해결책이 아니지만 올바른 방향으로 이끌 수 있습니다. 나는 최근 Django의 "공간이없는"템플릿 태그를 사용하고 디버깅 할 때 공백을 제거하지 않도록 지원을 추가했습니다.

해당 템플릿 태그의

일부는 이론적으로 노드를 선행하면 노드를 얻을 수있는 {%의 공간을 차지하지의 %} 사이에 수집 된 템플릿 노드 {%의 endspaceless의 %} 태그의 목록을 전달 ...

from django.conf import settings 
from django import template 
from django.utils.html import strip_spaces_between_tags 

register = template.Library() 

class SmartSpacelessNode(template.Node): 
    def __init__(self, nodelist): 
     self.nodelist = nodelist 

    def render(self, context): 
     content = self.nodelist.render(context) 
     #from here, you can probably delete the nodes after you've rendered 
     #the content to a variable, then render your tag 
     return content if settings.DEBUG else strip_spaces_between_tags(content.strip()) 

@register.tag 
def smart_spaceless(parser, token): 
    nodelist = parser.parse(('end_smart_spaceless',)) 
    parser.delete_first_token() 
    return SmartSpacelessNode(nodelist) 

당신을 도울 희망.

+0

이것은 올바른 방향으로 나아가는 단계입니다. 그러나 django에서 템플릿을 렌더링하는 것은 '상향식 (bottom-up)'입니다. 꼭 밑으로부터 노드를 얻고 싶습니다. nodelist는 굉장합니다, 나는 전혀 하나를 얻는 방법을 몰랐습니다. –

+1

흠. 그것은 흥미로운 문제입니다. 나는 조사를하고 내가 무엇을 생각해 낼 수 있는지 알아 보겠다. – Brandon

+0

음. 나는 장고의 템플릿 엔진을 사용하여 해결책을 찾을 수 없었다. 나는 Jinja를 전에 사용하지 않았지만, 나는 당신에게 도움이 될 수있는 "미리 시간"컴파일 기능이 있음을 알았다. http://jinja.pocoo.org/ – Brandon

관련 문제