我尝试为 jinja2 做扩展。我写了这样的代码:
但我收到异常:'NoneType' object is not iterable
. 错误在哪里?那应该返回parse
。还有什么应该接受和返回_media
?
我尝试为 jinja2 做扩展。我写了这样的代码:
但我收到异常:'NoneType' object is not iterable
. 错误在哪里?那应该返回parse
。还有什么应该接受和返回_media
?
您正在使用CallBlock
,这表示您希望您的扩展程序充当一个块。例如
{% mytest arg1 arg2 %}
stuff
in
here
{% endmytest %}
nodes.CallBlock
期望您向它传递代表扩展的主体(内部语句)的节点列表。目前这是您要经过的地方None
- 因此是您的错误。
解析完参数后,您需要继续解析块的主体。幸运的是,这很容易。你可以简单地做:
body = parser.parse_statements(['name:endmytest'], drop_needle=True)
然后返回一个新节点。CallBlock
接收一个要调用的方法(在本例中),该方法_mytestfunc
为您的扩展提供逻辑。
body = parser.parse_statements(['name:endmytest'], drop_needle=True)
return nodes.CallBlock(self.call_method('_mytestfunc', args),[], [], body).set_lineno(lineno)
或者,如果您不希望您的扩展成为块标签,例如
{% mytest arg1 arg2 %}
你不应该使用nodes.CallBlock
,你应该只使用nodes.Call
它,它不带 body 参数。所以就这样做:
return self.call_method('_mytestfunc', args)
self.call_method
只是一个方便的包装函数,它为您创建一个 Call 节点。
我花了几天时间编写 Jinja2 扩展,这很棘手。没有太多文档(除了代码)。coffin GitHub 项目在这里有一些扩展示例。