2012-01-04 19 views
6

DjangoまたはJinja2を使用している場合は、以前はこの問題が発生していた可能性があります。 私はこのようになりますJSON文字列があります。Django/Jinja2テンプレートのdictオブジェクトを文字列に変換する

{ 
    "data":{ 
    "name":"parent", 
    "children":[ 
     { 
     "name":"child_a", 
     "fav_colors":[ 
      "blue", 
      "red" 
     ] 
     }, 
     { 
     "name":"child_b", 
     "fav_colors":[ 
      "yellow", 
      "pink" 
     ] 
     } 
    ] 
    } 
} 

今、私は私のJinja2のテンプレートにこれを渡したい:

j = json.loads('<the above json here>') 
self.render_response('my_template.html', j) 

を...とこのようにそれを繰り返す:

<select> 
{% for p in data recursive %} 
     <option disabled>{{ p.name }}</option> 
     {% for c in p.children %} 
      <option value="{{ c.fav_colors|safe }}">{{ c.name }}</option> 
     {% endfor %} 
{% endfor %} 
</select> 

これは私が問題を抱えているところです.Jinja2がc.fav_colorsのUnicodeエンコード値を出力する以外はすべて動作します。私はjavascriptからアクセスできるように、有効なjavascript配列としてc.fav_colorsが必要です。 Jinjaに、その値を[u'blue', u'red']の代わりに['blue','red']のようなアスキーテキストとして出力するにはどうすればよいですか?

+1

ません終了タグを行うことができますか?また、なぜ{item%cのアイテムの%} "item" {forloop.last%}、{%endif%} {%endfor%}の%これは結局のためのテンプレートです。つまり、Pythonの値をビューが必要なものに変換します。 – jpic

+0

そのオプションタグを更新しました。私がここで使用しているループ構文は分かりやすくするためです。私はちょうど問題を紹介しようとしています:有効なJavaScript互換の配列としてc.fav_colorsを出力する方法: '['blue'、 'red']' – ofko

答えて

13

fav_colorsリストをJSONに戻す必要があります。おそらくこれを行う最も簡単な方法は、迅速なテンプレートフィルタで次のようになります。

@register.filter 
def to_json(value): 
    return mark_safe(simplejson.dumps(value)) 

をだから今、あなたが

<option value="{{ c.fav_colors|to_json }}"> 
+1

duh!もちろん。私は実際にwebapp2でJinja2を使用していますので、Jinjaのために@ register.filterを実行する方法を知る必要があります。 – ofko

+0

ありがとうございます。私はそれについて考えていないと信じられません:-) – ofko

+0

webapp2でこれをどうやってやっているのか不思議な人は、webapp2のdocsでJinja2を探して、BaseHandlerクラスで次のようにしてください: 'j = jinja2.get_jinja2 j.environment.filters.update({'to_json':to_json}) ' – ofko

関連する問題