2012-01-04 27 views
6

Nếu bạn sử dụng Django hoặc Jinja2, có thể bạn đã gặp sự cố này trước đây. Tôi có một chuỗi JSON trông như thế này:Chuyển đổi đối tượng dict thành chuỗi trong mẫu Django/Jinja2

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

Bây giờ tôi muốn chuyển thông tin này đến mẫu Jinja2 tôi:

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

... và lặp nó như thế này:

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

Đây là nơi tôi đang gặp sự cố: mọi thứ hoạt động ngoại trừ Jinja2 xuất ra các giá trị mã hóa unicode cho c.fav_colors. Tôi cần c.fav_colors như một mảng javascript hợp lệ để tôi có thể truy cập nó từ javascript. Làm thế nào tôi có thể nhận được Jinja để in giá trị đó như văn bản ascii như: ['blue','red'] thay vì [u'blue', u'red']?

+1

Không thẻ đóng? Ngoài ra, tại sao không [{% cho mục trong c%} "mục" {% nếu không phải forloop.last%}, {% endif%} {% endfor%}]? Đây là những gì mẫu cho sau khi tất cả: chuyển đổi giá trị python vào bất cứ điều gì cần xem. – jpic

+0

Đã cập nhật thẻ tùy chọn đó. Cú pháp vòng lặp mà tôi đang sử dụng ở đây là để rõ ràng. Tôi chỉ cố gắng để giới thiệu vấn đề: làm thế nào để xuất ra c.fav_colors dưới dạng mảng tương thích javascript hợp lệ: '['blue', 'red']' – ofko

Trả lời

13

Bạn cần chuyển đổi danh sách fav_colors trở lại JSON. Có lẽ là cách dễ nhất để làm điều này sẽ là với một mẫu lọc nhanh:

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

Vì vậy, bây giờ bạn có thể làm

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

duh! tất nhiên. nhưng tôi thực sự đang sử dụng Jinja2 với webapp2 vì vậy bây giờ tôi cần tìm hiểu cách thực hiện phần '@ register.filter' cho Jinja. – ofko

+0

Cảm ơn bạn. Tôi không thể tin rằng tôi đã không nghĩ rằng :-) – ofko

+0

Nếu ai đó tự hỏi làm thế nào tôi đã làm điều này trong webapp2: chỉ cần tra cứu Jinja2 trong tài liệu webapp2, sau đó làm một cái gì đó như thế này trong lớp BaseHandler: 'j = jinja2.get_jinja2 (app = self.app) j.environment.filters.update ({'to_json': to_json}) ' – ofko

Các vấn đề liên quan