Chaîne Unicode affichage sur Django template
Je suis en utilisant django v1.5.*, Je vais rendre le une variable nommée "foobar", qui est un json obj et notamment chaîne unicode.
def maison( demande ): importation json foo = {"name": u"赞我们一下"} bar = json.décharges( foo ) retour render_to_response( 'myapp/home.html', { "toto": bar, }, context_instance=RequestContext(demande) )
Et dans mon modèle, j'ai coder le json obj en javascript puis d'en ajouter à la div, il permet d'afficher la chaîne attendue:
foobar=JSON.encode('{{foobar|coffre-fort}}'); $("#foobar").html(foobar.nom);`
alors je peux obtenir le 赞一下我们
sur ma page web.
Mais j'ai trouvé que si j'utilise la variable directement:
<div id="foobar">{{ foobar }}</div>
il affichera la chaîne unicode en tant que chaîne d'octets:
{ "name":"\u8d5e\u4e00\u4e0b\u6211\u4eec" }
Même si j'ai l'aide de la {{foobar|safe}}
puis rien changer.
Maintenant, je veux vous demander pourquoi cela s'est vraiment passé ou est quelque chose de mal de moi? Que dois-je faire si je veux utiliser la variable directement comme {{ foobar }}
?
Vous devez vous connecter pour publier un commentaire.
bar = json.dumps(foo, ensure_ascii=False)
entraînerabar
être ununicode
objet; sans ensure_ascii=False,bar
est unstr
.De Django reinhardt, smart_text méthode pourrait également être utile pour les conversions.
C'est l'affichage de l'ensemble de l'objet dans son JSON-forme codée. Alors que vous pourriez utiliser
json.dumps(..., ensure_ascii=False)
de garder les caractères non-ASCII comme les Chinois dans leur forme brute, et non codés en ASCII-coffre-fort-JSON, ce serait encore de vous donner{"name": "赞一下我们"}
qui n'est probablement pas ce que vous voulez.Si vous voulez seulement le
name
propriété de l'objet inclus dans la div, vous aurez besoin de passer de l'élémentfoo['name']
à votre modèle ou de la totalité defoo
et le modèle comprennent{{foo.name}}
- plutôt que le tout encodé en JSON objet defoobar
.Il n'existe pas de méthode
encode
sur le standard ECMAJSON
objet, donc je ne sais pas ce que ça fait.Le JSON-méthode de codage est
JSON.stringify
. Mais vous ne voulez pas coder ici - vous avez déjà une chaîne avec une représentation JSON d'un objet ici parce que vous avez encodé au-dessus sur le côté serveur dans l'appel àjson.dumps
. Probablement vous dire:qui travaillent pour une valeur particulière de
name
, mais pas nécessairement en général. Par exemple, si le nom a étéa\nb
ensuite, vous recevez:auquel cas le
\n
serait d'obtenir analysé par l'interpréteur JavaScript comme étant un caractère de saut de ligne dans la chaîne, et la chaîne analysée comme JSON serait:qui est une erreur de syntaxe. Il y a aussi des problèmes de sécurité ici - contrairement à l'
|safe
affirmation, ce n'est pas sûr. Si lename
propriété contenus de la chaîne</script
puis vous vous retrouvez avec une prématurément terminée élément de script, ce qui peut conduire à des attaques de scripts intersites:Vous pouvez tenter de contourner ces en faire une deuxième couche de JS littéral de chaîne de codage dans le JSON sur le côté serveur, et remplacer manuellement
<
avec\u003C
. Mais probablement, il est préférable de prendre une approche différente de génération de code exécutable à la volée se heurte à des problèmes en général, en particulier lorsque vous avez plusieurs syntaxes différentes dans le mélange (Python/Django-modèle, HTML et JS/JSON).Si vous écrivez des données du document (par exemple dans un
data-
attribut) plutôt que le script ensuite, vous pouvez garder le normal et sécuritaire modèle de comportement de HTML, de s'échapper. Ensuite, la JS côté peut lire les données de la DOM. Par exemple:(jQuery
data
méthode implicitement leJSON.parse
pour vous.)Ce qui contribue à la séparation des préoccupations, se JS dans des scripts externes, et, potentiellement, éventuellement à l'aide de Contenu de la Politique de Sécurité.
Vous avez besoin de faire référence à l'élément à l'intérieur de la dict, sans JSON-encoder.
...