2012-01-04 14 views
6

Se si utilizza Django o Jinja2, probabilmente ci si è già imbattuti in questo problema. Ho uno stringa JSON che assomiglia a questo:Conversione di oggetto dict in stringa in modello Django/Jinja2

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

Ora voglio passare questo al mio modello Jinja2:

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

... e iterare in questo modo:

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

Questo è dove sto avendo il problema: tutto funziona eccetto che Jinja2 emette valori codificati in Unicode per c.fav_colors. Ho bisogno di c.fav_colors come un array javascript valido in modo che possa accedervi da javascript. Come posso convincere Jinja a stampare quel valore come testo ASCII come: ['blue','red'] anziché [u'blue', u'red']?

+1

No tag di chiusura? Inoltre, perché non [{% per articolo in c%} "articolo" {% se non forloop.last%}, {% endif%} {% endfor%}]? Questo è ciò che i modelli sono per tutti: convertire i valori Python in qualunque cosa abbia bisogno della vista. – jpic

+0

Aggiornamento del tag di opzione. La sintassi del loop che sto usando qui è per chiarezza. Sto solo provando a mostrare il problema: come esportare c.fav_colors come array compatibile javascript valido: '['blue', 'red']' – ofko

risposta

13

È necessario convertire l'elenco fav_colors in JSON. Probabilmente il modo più semplice per farlo sarebbe stato con un filtro modello di rapida:

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

Così ora si potrebbe fare

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

duh! ovviamente. ma in realtà sto usando Jinja2 con webapp2 quindi ora ho bisogno di scoprire come fare la parte '@ register.filter' per Jinja. – ofko

+0

Grazie. Non posso credere di non averlo pensato :-) – ofko

+0

Se qualcuno si sta chiedendo come ho fatto questo in webapp2: basta cercare Jinja2 nei documenti webapp2, quindi fare qualcosa di simile nella classe BaseHandler: 'j = jinja2.get_jinja2 (app = self.app) j.environment.filters.update ({'to_json': to_json}) ' – ofko