Ale*_*ndr 2 python templates jinja2
我尝试为jinja2进行扩展.我写了这样的代码:
但我得到例外:'NoneType' object is not iterable.哪个错误?那会回来parse.什么应该接受和返回_media?
Bri*_*ell 11
您正在使用a CallBlock,表示您希望扩展程序充当块.例如
{% mytest arg1 arg2 %}
stuff
in
here
{% endmytest %}
Run Code Online (Sandbox Code Playgroud)
nodes.CallBlock期望您传递一个表示扩展的主体(内部语句)的节点列表.目前这是你通过的地方None- 因此你的错误.
一旦解析了参数,就需要继续解析块的主体.幸运的是,这很容易.你可以简单地做:
body = parser.parse_statements(['name:endmytest'], drop_needle=True)
Run Code Online (Sandbox Code Playgroud)
然后返回一个新节点.在CallBlock接收到被调用(在这种情况下的方法_mytestfunc),其提供逻辑为您的扩展.
body = parser.parse_statements(['name:endmytest'], drop_needle=True)
return nodes.CallBlock(self.call_method('_mytestfunc', args),[], [], body).set_lineno(lineno)
Run Code Online (Sandbox Code Playgroud)
或者,如果您不希望您的扩展名成为块标记,例如
{% mytest arg1 arg2 %}
Run Code Online (Sandbox Code Playgroud)
你不应该使用nodes.CallBlock,你应该使用nodes.Call,而不是一个身体参数.所以这样做:
return self.call_method('_mytestfunc', args)
Run Code Online (Sandbox Code Playgroud)
self.call_method 只是一个方便的包装函数,可以为您创建一个Call节点.
我花了几天写Jinja2扩展,这很棘手.文档不多(代码除外).棺材GitHub的项目有扩展的几个例子在这里.
| 归档时间: |
|
| 查看次数: |
3561 次 |
| 最近记录: |