2012-01-04 12 views
6

Si usa Django o Jinja2, probablemente haya tenido este problema antes. que tienen una cadena JSON que tiene este aspecto:Conversión de objeto dict a cadena en la plantilla Django/Jinja2

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

Ahora quiero pasar esto a mi plantilla Jinja2:

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

... e iterar así:

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

Aquí es donde tengo el problema: todo funciona, excepto Jinja2 genera valores codificados en unicode para c.fav_colors. Necesito c.fav_colors como una matriz de JavaScript válida para poder acceder a ella desde JavaScript. ¿Cómo puedo obtener Jinja para imprimir ese valor como texto ascii como: ['blue','red'] en lugar de [u'blue', u'red']?

+1

Sin etiqueta de cierre? Además, ¿por qué no [{% para el elemento en c%} "elemento" {% if not forloop.last%}, {% endif%} {% endfor%}]? Esto es lo que las plantillas son para después de todo: convertir los valores de Python en lo que necesite la vista. – jpic

+0

Actualicé esa etiqueta de opción. La sintaxis de bucle que estoy usando aquí es para mayor claridad. Estoy tratando de mostrar el problema: cómo sacar c.fav_colors como una matriz válida compatible con JavaScript: '['blue', 'red']' – ofko

Respuesta

13

Necesita convertir la lista fav_colors de nuevo a JSON. Probablemente la forma más sencilla de hacerlo sería con un filtro de plantilla rápida:

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

Así que ahora usted podría hacer

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

duh! por supuesto. pero en realidad estoy usando Jinja2 con webapp2, así que ahora necesito averiguar cómo hacer la parte '@ register.filter' para Jinja. – ofko

+0

Gracias. No puedo creer que no haya pensado en eso :-) – ofko

+0

Si alguien se pregunta cómo hice esto en webapp2: solo busque Jinja2 en documentos webapp2, luego haga algo como esto en la clase BaseHandler: 'j = jinja2.get_jinja2 (app = self.app) j.environment.filters.update ({'to_json': to_json}) ' – ofko