免责声明:这是来自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调查,但到目前为止我看不到任何有用的东西。
因此;是否可以使用传递给模板标记的解析器对象来编译模板,并检索最终的渲染输出?
答案 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)
希望能帮到你。