如何在django中的模板标记内获取模板的渲染输出?

时间:2011-04-10 13:07:11

标签: django django-templates

免责声明:这是来自my previous question的后续问题。

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

我做了一些快速的pdb.set_trace调查,但到目前为止我看不到任何有用的东西。

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

1 个答案:

答案 0 :(得分: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)

希望能帮到你。