2012-01-04 12 views
6

Jeśli używasz Django lub Jinja2, prawdopodobnie napotkałeś już ten problem. Mam ciąg JSON, który wygląda tak:Konwersja obiektu dict na ciąg w szablonie Django/Jinja2

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

teraz chcę przekazać to do mojego szablonu Jinja2:

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

... i iteracyjne to tak:

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

To tutaj mam problem: wszystko działa, oprócz Jinja2 generuje zakodowane wartości Unicode dla c.fav_colors. Potrzebuję c.fav_colors jako poprawnej tablicy javascript, aby móc uzyskać do niej dostęp z javascript. Jak mogę sprawić, by Jinja wydrukowała tę wartość jako tekst ASCII: ['blue','red'] zamiast [u'blue', u'red']?

+1

nr tag zamykający? Ponadto, dlaczego nie [{% dla pozycji w c%} "pozycji" {%, jeśli nie forloop.last%}, {% endif%} {% endfor%}]? To właśnie są szablony: konwertowanie wartości Pythona na wszystko, czego potrzebuje widok. – jpic

+0

Zaktualizowano tę opcję. Składnia pętli, której tu używam, jest jasna. Po prostu próbuję pokazać problem: jak wypisać c.fav_colors jako prawidłową tablicę zgodną z javascript: '['blue', 'red']' – ofko

Odpowiedz

13

Musisz przekonwertować listę fav_colors z powrotem na JSON. Prawdopodobnie najprostszym sposobem na to byłoby szybkim filtrze szablonu:

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

Więc teraz można zrobić

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

duh! oczywiście. ale faktycznie używam Jinja2 z webapp2, więc teraz muszę dowiedzieć się, jak zrobić część "@ register.filter" dla Jinja. – ofko

+0

Dziękuję. Nie mogę uwierzyć, że o tym nie myślałem :-) – ofko

+0

Jeśli ktoś się zastanawia, jak to zrobiłem w webapp2: po prostu przejrzyj Jinja2 w dokumentach webapp2, następnie wykonaj coś takiego w klasie BaseHandler: 'j = jinja2.get_jinja2 (app = self.app) j.environment.filters.update ({'to_json': to_json}) ' – ofko