2011-07-07 17 views
5

Estoy usando Flask con Jinja2 como lenguaje de plantillas.Jinja2: ¿Cómo crear una matriz javascript multidimensional?

¿Cómo se convierte una estructura de Python multidimensional a una estructura correspondiente en javascript usando Jinja2?

Ejemplo (Python/frasco):

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

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

Ejemplo (Jinja2):

?? 

Creo que lo que estoy pidiendo es, puede que sólo se realiza creando construcciones de bucle contorneados en Jinja2, ¿o me falta un atajo en alguna parte?

Si la respuesta es sí, uno tiene que usar bucles intrincados en Jinja2, entonces probablemente sea mucho más fácil crear el código javascript directamente en python y pasarlo a Jinja2 para su inclusión.

Pero eso parece frustrar el propósito de utilizar un lenguaje de plantillas como Jinja2 un tanto ...

me trataron (Jinja2):

{{ pyStruct|safe }} 

... y esto realmente funciona, siempre y cuando nada es unicode, y no se sale de la tierra Ascii (lo que generalmente hace en mi caso).

Ah, y si se pregunta por qué pasar este tipo de estructura? Encuentro que a menudo quiero pasar estructuras bastante complicadas a JavaScript para ser usadas por menús y otras complicadas interfaces de selección.

Respuesta

7

Puede usar el módulo json, ya sea como filtro Jinja o pasando directamente los resultados de json.dumps() a su plantilla.

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

En la plantilla:

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

Advertencia: Soy un poco inseguro sobre el bit de escape (| filtro de correo). Es posible que desee comprobar que los caracteres <,>, & se hayan escapado correctamente con secuencias de escape Unicode en lugar de entidades XML.

+0

Gracias jd (y Björn!), ¡Eso resuelve mi problema con elegancia! – herira

2

serializarlo usando 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) 

frasco es probable que tenga una forma equivalente a JSON serializar los datos. Este puede también se puede hacer utilizando construcciones de bucle en jinja2, pero es mucho más lento que con json.

Cuestiones relacionadas