2011-07-07 62 views
5

FlaskJinja2をテンプレート言語として使用しています。Jinja2:多次元のjavascript配列を作成するには?

Jinja2を使用して、多次元のPython構造体をJavaScriptの対応する構造体に変換するにはどうすればよいですか?

の例(Pythonの/フラスコ):

pyStruct = [{key1:value1, key2:value2, [{subkey1:subvalue1, subkey2:subvalue2,}]}, 
      {key1:value1, key2:value2, [{subkey1:subvalue1, subkey2:subvalue2,}]},] 

render_template('jinjatemplate.html', pyStruct=pyStruct) 

例(Jinja2の):

?? 

私は私が求めているものを推測ですが、それだけで複雑なループ構造を作成することによって行うことができますJinja2、または私はどこかでショートカットを逃していますか?

答えが「はい」の場合は、Jinja2で複雑なループを使用する必要があります.JavaScriptコードをPythonで直接作成し、これをJinja2に渡してインクルードしてください。

しかし、それはややJinja2のようなテンプレート言語を使用する目的を倒すようだ...

私は(Jinja2の)を試してみました:

{{ pyStruct|safe }} 

...と、これは実際には何もない限り動作しますユニコードで、Asciiの土地から逸脱することはありません(通常は私の場合)。

ああ、なぜこの種の構造を渡すのだろうか?メニューや他の複雑な選択インターフェースで使用するために、かなり複雑な構造をjavascriptに渡したいことがよくあります。

答えて

7

jsonモジュールは、json.dumps()の結果をテンプレートに直接渡すジンジャーフィルタとしても使用できます。テンプレートで

pyStruct = [{key1:value1, key2:value2, [{subkey1:subvalue1, subkey2:subvalue2,}]}, 
      {key1:value1, key2:value2, [{subkey1:subvalue1, subkey2:subvalue2,}]},] 

render_template('jinjatemplate.html', json_struct=json.dumps(pyStruct)) 

var myStruct = ({{ json_struct|e }}); 

警告:(| Eフィルタ)私はエスケープビットについて少しわかりませんよ。 <、>、&文字がxmlエンティティではなくユニコードエスケープシーケンスで正しくエスケープされているかどうかを確認したい場合があります。

+0

jd(とBjörn!)さん、ありがとうございます、私の問題を優雅に解決します! – herira

2

JSONを使用して、それをシリアル化:

from django.utils import simplejson 

pyStruct = [{'key1':'value1', 
      'key2':'value2', 
      'key3':[{'subkey1':'subvalue1', 'subkey2':'subvalue2'}]}, 
      {'key1':'value1', 
      'key2':'value2', 
      'key3':[{'subkey1':'subvalue1', 'subkey2':'subvalue2'}]}] 
print simplejson.dumps(pyStruct) 

フラスコ可能性が高いデータをシリアル化JSONに同等の方法があります。このでもjinja2のループ構文を使って行うことができますが、jsonを使うよりも何倍も遅くなります。