2

jinja2の拡張機能を作ってみました。私はそのようなコードを書きました:

http://dumpz.org/12996/

しかし、私は例外を受け取ります: 'NoneType' object is not iterable. バグはどこですか?それは返されるはずparseです。また、何を受け入れて返す必要があり_mediaますか?

4

1 に答える 1

11

を使用しています。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拡張機能を書くのに数日を費やしましたが、それは注意が必要です。(コード以外の)ドキュメントはあまりありません。棺桶のGitHubプロジェクトには、ここに拡張機能の例がいくつかあります。

于 2009-11-25T13:36:49.480 に答える