2012-01-04 20 views
6

Django veya Jinja2'yi kullanırsanız, muhtemelen daha önce bu soruna rastladınız demektir.Django/Jinja2 şablonunda dict nesnesini dizgeye dönüştürme

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

Şimdi benim jinja2 şablona bu geçmek istiyorum: Şöyle bir JSON dizesi

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

... ve şu şekilde yineleme:

<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> 

Burada sorun yaşıyorum: her şey, c.fav_colors için Jinja2 çıkışları unicode kodlanmış değerleri dışında çalışır. Javascript'ten erişebilmem için geçerli bir javascript dizisi olarak c.fav_colors'a ihtiyacım var. Jinja'yı şu değerdeki ascii metin olarak yazdırmayı nasıl sağlayabilirim? [u'blue', u'red'] yerine ['blue','red']?

+1

No kapanış etiketi yapabilirdi? Ayrıca, neden [{% c öğesi için%}} "öğe" {% ifloop.last%} değilse% {% endif%} {% endfor%}] neden olmasın? Bu, şablonların ne için olduğuyla ilgili: python değerlerini, görünümüne ihtiyacı olan her şeye dönüştürmek. – jpic

+0

Bu seçenek etiketini güncelledi. Burada kullanıyorum döngü sözdizimi açıklık içindir. Sadece problemi sergilemeye çalışıyorum: c.fav_colors öğesini javascript ile uyumlu bir dizi olarak nasıl çıkaralım: '['blue', 'red']' – ofko

cevap

13

fav_colors listesini JSON'a dönüştürmeniz gerekir. Muhtemelen Bunu yapmanın en kolay yolu hızlı bir şablon filtreli olacaktır:

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

Yani şimdi

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

duh! tabii ki. Ama ben şimdi webapp2 ile Jinja2 kullanıyorum, şimdi Jinja için '@ register.filter' kısmının nasıl yapıldığını öğrenmem gerekiyor. – ofko

+0

Teşekkür ederim. Bunu düşünemediğime inanamıyorum :-) – ofko

+0

Webapp2'de bunu nasıl yaptığımı merak eden biri varsa: sadece webapp2 belgelerinde Jinja2 araması yapın, sonra BaseHandler sınıfında böyle bir şey yapın: j = jinja2.get_jinja2 (app = self.app) j.environment.filters.update ({'to_json': to_json}) ' – ofko

İlgili konular