4

我找不到如何将多个命名参数传递给 jinja2 扩展。我想要这样的东西:

{% some_extension foo='foo' bar='bar' %}
    data
{% end_someextension %}
4

2 回答 2

1

这就是我克服这个问题的方法:

{% exttag 'main', scope='global', auto='root' %}{% endexttag %}

解析方法:

def parse(self, parser):
  lineno = parser.stream.__next__().lineno
  context = nodes.ContextReference()
  key = parser.parse_expression()
  parser.stream.skip_if('comma')
  if parser.stream.skip_if('name:scope'):
    parser.stream.skip(1)
    scope = parser.parse_expression()
  else:
    scope = nodes.Const('page')
  parser.stream.skip_if('comma')
  if parser.stream.skip_if('name:auto'):
    parser.stream.skip(1)
    auto = parser.parse_expression()
  else:
    auto = nodes.Const(None)
  args = [key,scope,auto,context]
  body = parser.parse_statements(['name:endexttag'], drop_needle=True)
  return nodes.CallBlock(self.call_method('_render_block', args),
                           [], [], body).set_lineno(lineno)

可能有一种更优雅的方式来实现这一点,但这对我有用,但不会过于复杂。如果您希望模板编写器能够以任何顺序指定关键字,则必须使用循环。

但这绝对允许您在扩展中使用关键字参数。

于 2015-02-03T04:57:25.403 回答
0
{% macro some_extension(foo='foo', bar="bar") %}
    {{ foo }}, {{bar}}
{% endmacro %}

这是你想要的??

于 2013-05-20T12:22:54.543 回答