2013-03-22 18 views
7

Tôi đang cố chuyển một từ điển sang mẫu django. Trong giao diện django, biến được khởi tạo và thông qua như vậy:django: hiển thị biến có bộ lọc an toàn mà không có trình định kiểu kiểu 'u' unicode

foo = {'a':'b'} 
... 
return render(request, 'template.html', {'foo': str(foo)} 

trong mẫu, tôi có

{{ foo|default:"{}"|safe}} 

Trong trường hợp nó có liên quan, tôi có dòng trên trong một đoạn jquery. Đoạn đó là thất bại vì dict đang được trả lại như

[{'a': u'b'}] 

thay vì những gì tôi mong đợi:

[{'a': 'b'}] 

Có vẻ như bộ lọc an toàn không được tháo unicode u trước giá trị dict 'b'. Làm thế nào để làm điều đó?

+2

'trở lại làm (yêu cầu, 'template.html', {'foo': foo.encode ("utf8")} ' – catherine

+0

@catherine foo (từ điển) có phương pháp mã hóa không? Tôi không nghĩ vậy. Trong mọi trường hợp, tôi đã thử str (foo) .encode ("utf8"), và điều đó vẫn không hoạt động – Neil

+0

Bạn có ý định hiển thị dict là JSON không? Nếu vậy, có những lựa chọn tốt hơn. – valtron

Trả lời

5

Bạn nên sử dụng một chức năng để chuyển đổi một cách rõ ràng để JSON, vì một vài sự khác biệt tinh tế giữa JSON và stringification Python mặc định:

  • Một chuỗi trong JSON về mặt kỹ thuật phải được phân cách bằng " hơn ', mặc dù phân tích cú pháp có xu hướng chấp nhận sau này quá (xem nguyên tắc chuỗi trên json.org)

  • literals
  • Bool là chữ thường

  • Nếu dữ liệu của bạn có chứa những thứ khác hơn con số, chuỗi, danh sách và dicts, sử dụng str trên chúng có thể sẽ âm thầm sản xuất JSON không hợp lệ

Sử dụng một mẫu bộ lọc như django-jsonify:

{% load jsonify %} 
... 
{{ foo|jsonify }} 
0

Lý do tôi gặp sự cố này là do từ điển của tôi thực sự bao gồm giá trị unicode. Ví dụ đồ chơi ở trên là một sự đơn giản hóa. khi tôi chạy str(val) trước khi chèn val vào dict, kết xuất xảy ra như mong đợi.

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