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