2012-01-04 3 views
6

Если вы используете Django или Jinja2, вы, вероятно, столкнулись с этой проблемой раньше. У меня есть JSON строку, которая выглядит следующим образом:Преобразование объекта dict в строку в шаблоне Django/Jinja2

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

Теперь я хочу, чтобы передать это в шаблон jinja2:

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

... и перебирать это так:

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

Здесь я столкнулся с проблемой: все работает, кроме Jinja2 выводит кодированные значения unicode для c.fav_colors. Мне нужен c.fav_colors как допустимый массив javascript, чтобы я мог получить к нему доступ из javascript. Как я могу заставить Jinja напечатать это значение как текст ascii, например: ['blue','red'] вместо [u'blue', u'red']?

+1

Нет закрывающий тег? Кроме того, почему бы не [{% for item in c%} "item" {% if not forloop.last%}, {% endif%} {% endfor%}]? Это то, за чем все шаблоны: преобразование значений python во все, что необходимо для представления. – jpic

+0

Обновлен этот тег опции. Синтаксис цикла, который я использую для ясности. Я просто пытаюсь показать проблему: как вывести c.fav_colors в качестве допустимого javascript-совместимого массива: '['blue', 'red']' – ofko

ответ

13

Вам необходимо преобразовать список fav_colors в JSON. Возможно, самый простой способ сделать это было бы с быстрым фильтром шаблона:

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

Так что теперь вы можете сделать

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

duh! конечно. но я фактически использую Jinja2 с webapp2, поэтому теперь мне нужно выяснить, как сделать «@ register.filter» часть для Jinja. – ofko

+0

Спасибо. Не могу поверить, что я не думал об этом :-) – ofko

+0

Если кто-то задается вопросом, как я это сделал в webapp2: просто найдите Jinja2 в файлах webapp2, затем сделайте что-то подобное в классе BaseHandler: 'j = jinja2.get_jinja2 (app = self.app) j.environment.filters.update ({'to_json': to_json}) ' – ofko

Смежные вопросы