如何创建jinja2扩展?

时间:2009-10-05 19:22:57

标签: python templates jinja2

我尝试为jinja2进行扩展。我写了这样的代码:

http://dumpz.org/12996/

但我收到例外:'NoneType' object is not iterable。哪个错误? 这应该返回parse。还有什么应该接受并返回_media

1 个答案:

答案 0 :(得分:11)

您使用的是CallBlock,表示您希望扩展程序充当阻止。 E.g。

{% 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扩展程序,这很棘手。文档不多(代码除外)。棺材GitHub项目有一些扩展here的例子。