2013-03-22 6 views
7

Próbuję przekazać słownik do szablonu django. W widoku django, zmienna jest inicjowany i przekazany jako takie:django: renderowanie zmiennej z bezpiecznym filtrem bez oznaczenia typu "u" Unicode

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

w szablonie mam

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

w przypadku jest to istotne, mam powyższą linię urywek jQuery. Że urywek się niepowodzeniem, ponieważ dict jest renderowany jako

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

zamiast czego oczekuję:

[{'a': 'b'}] 

Wydaje się, że bezpieczny filtr nie jest usunięcie Unicode U poprzedniej wartości dict „B”. Jak mogę to zrobić?

+2

'powrót renderowanie (request, 'template.html', {'foo': foo.encode ("utf8")} ' – catherine

+0

@ catherine does foo (słownik) ma metodę kodowania? Nie sądzę. W każdym razie próbowałem str (foo) .encode ("utf8"), a to nadal nie działa – Neil

+0

Czy chcesz renderować dykta jako JSON? Jeśli tak, są lepsze opcje. – valtron

Odpowiedz

5

należy używać funkcji jawnie przekonwertować go do formatu JSON, ponieważ od kilku subtelnych różnic między JSON i stringification domyślny Python:

  • ciąg w JSON technicznie musi być ograniczony z " zamiast ', choć Parsery tendencję do akceptować ten ostatni też (patrz zasada ciąg na json.org)

  • Bool literały są małe

  • Jeśli dane zawierają rzeczy inne niż liczby, ciągi znaków, list i dicts korzystając str na nich będzie prawdopodobnie cicho produkować nieważny JSON

Użyj filtru szablonu takich jak django-jsonify:

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

Powodem, dla którego doświadczałem tego problemu, był fakt, że mój słownik zawierał wartość Unicode. Powyższy przykład zabawek był uproszczeniem. kiedy przed wprowadzeniem wartości val do dyktowania wykonałem str(val), renderowanie przebiegło zgodnie z oczekiwaniami.

Powiązane problemy