Jinja2扩展标记在另一个标记内

时间:2014-10-08 16:23:38

标签: python jinja2

我想做这样的事情

{% mytag country "italy" year "2014" %}
    workday
{% holyday %}
    not workday
{% endmytag %}

但是,瞻礼标签是可选的。 这也必须有效:

{% mytag country "italy" year "2014" %}
    workday
{% endmytag %}

我写了代码

class MytagExtension(Extension):
    tags = set(['mytag'])

    def __init__(self, environment):
        super(TranslateExtension, self).__init__(environment)

    def parse(self, parser):
        lineno = parser.stream.next().lineno

        if parser.stream.skip_if('name:country'):
            country= parser.parse_primary()
        else:
            country= nodes.Const(None)
        if parser.stream.skip_if('name:year'):
            year = parser.parse_primary()
        else:
            year = nodes.Const(None)

        args = [country, year]

        # body1 = parser.parse_statements(['name:holyday']) # not working :)

        body = parser.parse_statements(['name:endmytag'], drop_needle=True)
        return nodes.CallBlock(self.call_method('_helper', args),
                           [], [], body).set_lineno(lineno)

    def _helper(self, country, year, caller):
        etc ....

类似于if else endif,但我找不到if标记的源代码(如果它作为扩展名存在)

我该怎么做? 显然在我的_helper我需要第一个和第二个分支,因为我选择了哪一个分支。

1 个答案:

答案 0 :(得分:1)

好的,这是一个答案,它并不完美,可能不是最好的,但它是一些东西。

    ...
    body = parser.parse_statements(
               ['name:endmytag', 'name:holyday'], 
               drop_needle=True
           )
    if not parser.stream.current.test('block_end'):
        body.extend ( parser.parse_statements(['name:endmytag'], drop_needle=True) )

    args = [
         country, 
         year, 
         nodes.Const([y.data for x in body for y in x.nodes]), #I don't like this line a lot :)
           ]
    return nodes.CallBlock(self.call_method('_helper', args),
                           [], [], body).set_lineno(lineno)
    ...

以这种方式在_helper中,您将收到第三个参数(列表),并选择是否返回此列表的第一个或第二个元素。