【问题标题】:Help with custom Jinja2 Extension帮助自定义 Jinja2 扩展
【发布时间】:2011-05-12 01:38:22
【问题描述】:

我一直在努力让这个 Jinja2 自定义扩展工作——当他们说编写一个不适合“平民”时,文档并不是在开玩笑——最终设法得到这个工作代码:

class WrapperExtension(Extension):

    tags = set(['wrap'])

    def parse(self, parser):
        lineno = parser.stream.next().lineno
        args = [parser.parse_expression()]
        args.append(nodes.Const(args[0].name))
        return nodes.CallBlock(
            self.call_method('_render', args),
            [], [], []).set_lineno(lineno)

    def _render(self, value, name, *args, **kwargs):
        if some_condition():
            return '<wrapper id="%s">%s</wrapper>' % (name, value)
        return value

正如我所说,这正在起作用。我不确定的是为什么我需要在parse() 中返回nodes.CallBlock,而不是self.call_method()(它返回一个nodes.Call 对象)。如果有人有任何见解——或者可以指点我编写扩展的教程——请告诉我。

【问题讨论】:

  • 前段时间我写了一个 Jinaj2 扩展...已经忘记了一切:)

标签: python jinja2


【解决方案1】:

原因是parse()期望返回一个语句节点,例如CallBlockAssigncall_method() 返回一个表达式节点,您必须将其包装在 CallBlock 中才能有一个语句。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-26
    相关资源
    最近更新 更多