【问题标题】:How can I get the rendered output of a template within a template tag in django?如何在 django 的模板标签中获取模板的渲染输出?
【发布时间】:2011-08-02 11:40:20
【问题描述】:

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

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

所以;是否可以使用传递给模板标签的解析器对象来编译模板并检索最终呈现的输出?

【问题讨论】:

  • 删除了包含 Mako 标签的编辑。这个问题的答案不涉及 Mako。它明确地是关于使用 django 模板标签来呈现 django 模板的当前总输出。

标签: django django-templates


【解决方案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)

希望对你有所帮助。

【讨论】:

  • 这绝对是朝着正确方向迈出的一步。但是,在 django 中渲染模板会“自下而上”。我想从自上而下获取节点 - 从最底层。虽然节点列表很棒,但我根本不知道如何获得。
  • 嗯。这是一个有趣的问题。我会做一些调查,看看我能想出什么。
  • 好吧。我无法想出使用 Django 模板引擎的解决方案。我以前没有使用过 Jinja,但我确实注意到他们有一个“提前”编译功能,可以帮助你:jinja.pocoo.org
  • 感谢您的帮助,但我真的不认为我想要实现的目标是可能的。我认为在 mako 中提供包装模板是可行的方法。
猜你喜欢
  • 2021-11-25
  • 2019-12-04
  • 2018-10-05
  • 1970-01-01
  • 2012-01-04
  • 2015-09-21
  • 2012-02-29
  • 2013-10-16
  • 1970-01-01
相关资源
最近更新 更多