2013-03-22 5 views
7

Sto provando a passare un dizionario a un modello django. Nella vista Django, la variabile viene inizializzata e passato come tale:django: rendering di una variabile con filtro sicuro senza codifica 'u' di tipo identificatore

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

Nel modello, ho

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

Nel caso in cui sia rilevante, ho la linea di cui sopra in un frammento di jQuery. Questo frammento sta fallendo perché il dict viene reso come

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

invece di quello che mi aspetto:

[{'a': 'b'}] 

Sembra il filtro di sicurezza non sta rimuovendo l'unicode u precede il valore dict 'b'. Come lo faccio?

+2

'render ritorno (richiesta, 'template.html', {'foo': foo.encode ("utf8")} ' – catherine

+0

@catherine fa pippo (un dizionario) ha un metodo di codifica? Io non la penso così In ogni caso, ho provato str (foo) .encode ("utf8"), e che non funziona ancora – Neil

+0

Intendi renderizzare il dict come JSON? Se è così, ci sono opzioni migliori. – valtron

risposta

5

Si deve usare una funzione per convertire in modo esplicito a JSON, a causa di alcune sottili differenze tra JSON e in stringa di default di Python:

  • Una stringa in JSON tecnicamente deve essere delimitato con " piuttosto che ', anche se parser tendono ad accettare quest'ultima troppo (vedi la regola stringa su json.org)

  • Bool letterali sono minuscole

  • Se i dati contengono cose diverse da numeri, stringhe, liste e dicts, utilizzando str su di loro, probabilmente in silenzio produrrà JSON valido

Utilizzare un filtro modello come ad esempio django-jsonify:

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

Il motivo per cui ho riscontrato questo problema è dovuto al fatto che il mio dizionario includeva effettivamente un valore unicode. L'esempio del giocattolo sopra era una semplificazione. quando ho eseguito str(val) prima di inserire val in dict, il rendering si è verificato come previsto.