2012-01-04 4 views
6

Django 또는 Jinja2를 사용하는 경우 이전에이 문제가 발생했을 가능성이 큽니다.django/Jinja2 템플릿에서 dict 객체를 문자열로 변환

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

지금 내 Jinja2 템플릿이 전달하려는 : 나는 다음과 같습니다 JSON 문자열이

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 출력을 제외한 모든 것이 c.fav_colors의 유니 코드 인코딩 값을 출력합니다. 내가 자바 스크립트에서 액세스 할 수 있도록 유효한 자바 스크립트 배열로 c.fav_colors가 필요합니다. Jinja가 [u'blue', u'red'] 대신에 ['blue','red']과 같은 ASCII 텍스트로 해당 값을 인쇄하도록하려면 어떻게합니까?

+1

없음 닫는 태그 작업을 수행 할 수 있습니까? 또한, {item % c % item "item"{% forloop.last %}, {% endif %} {% endfor %}]에 대한 {{% 결국 템플릿은 파이썬 값을 뷰가 필요한 것으로 변환합니다. – jpic

+0

해당 옵션 태그가 업데이트되었습니다. 여기에서 사용하는 루프 구문은 명확성을위한 것입니다. 난 그냥 문제를 보여 주려고 : 어떻게 유효한 javascript 호환 배열로 c.fav_colors 출력 :'[ '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! 당연하지. 하지만 실제로 webapp2와 함께 Jinja2를 사용하고 있으므로 Jinja를 위해 '@ register.filter'부분을 수행하는 방법을 알아야합니다. – ofko

+0

감사합니다. 나는 그것을 생각하지 않았다는 것을 믿을 수 없다 :-) – ofko

+0

만약 내가 webapp2에서 이것을 어떻게했는지 궁금하다면 : webapp2 문서에서 Jinja2를 찾은 다음 BaseHandler 클래스에서 다음과 같이하면된다 :'j = jinja2.get_jinja2 ( j.environment.filters.update ({ 'to_json': to_json}) ' – ofko

관련 문제