2011-04-10 64 views
2

免责声明:这是关于my previous question的问题。如何在django的模板标签中获取模板的渲染输出?

我试图在Django中编写一个模板标签,它将呈现自己在Mako模板的主体内。我不确定这是否可以实现,但这对我的项目非常有用,可能还有很多其他人在Django中使用Mako模板。

这里是我的标签定义:

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,并将其用作我正在定义的节点的渲染函数的输出。我的希望是,当模板上调用渲染时,它只需要渲染这个节点,因为我的模板标签已经完成了其他所有的编译。目的是将extend_mako标记作为树中的最终标记。

我已经做了一些快速的pdb.set_trace调查,但我看不到任何有助于到目前为止。

所以;是否有可能使用解析器对象,传递给模板标签,编译模板,并检索最终的渲染输出?

+0

删除了包含Mako标记的编辑。这个问题的答案不涉及Mako。它明确地使用django模板标记来呈现django模板的当前总输出。 – 2011-04-11 00:13:04

回答

1

这不是针对您的问题的解决方案,但可能会让您朝正确的方向发展。我最近采用了Django的“无空间”模板标签,并增加了支持,以便在调试时不会将空白字体去掉。

该模板标签的

部分经过{%spaceless%}之间收集模板节点{%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中渲染一个模板是'自下而上'的。我想从最底层获取自上而下的节点。虽然节点列表很棒,但我根本不知道如何获取它。 – 2011-04-13 03:49:25

+1

嗯。这是一个有趣的问题。我会做一些调查,看看我能想出什么。 – Brandon 2011-04-13 04:07:00

+0

好吧。我无法使用Django的模板引擎提出解决方案。我之前没有使用Jinja,但我确实注意到他们有一个“提前”编译功能,可以帮助你:http://jinja.pocoo.org/ – Brandon 2011-04-15 14:50:56