2011-06-08 5 views
5

J'ai une variable qui contient du JSON Je dois passer dans un modèle. Je le définis comme une variable, puis je le passe dans le template avec succès. Cependant, j'ai besoin du format pour remplacer les citations avec ", mais remplace avec '. Cela est à l'origine des problèmes avec le service que je "suis la passer àUtilisation de JSON dans le modèle django

image_upload_params = 
{ 
    "auth": { 
    "key": "xxx" 
    }, 
    "template_id": "xxx", 
    "redirect_url": "url-here", 
} 

Voici comment il va venir dans le modèle.

{'redirect_url': 'url-here', 'template_id': 'xxx', 'auth': {'key': 'xxx'}} 

Toute idée comment obtenir à utiliser " à la place?

Répondre

12

utilisation SafeString:

from django.utils.safestring import SafeString 

def view(request): 
    ... 
    return render(request, 'template.html', {'upload_params': SafeString(json_string)}) 
+0

Merci . Je réalise le problème principal. Quand je mets la variable, python change mes guillemets doubles en guillemets simples. C'est la racine du problème. Pour ce service, j'ai besoin pour eux d'être des guillemets doubles. Des idées? – Brenden

+0

Je suis perplexe quant à la question de savoir si cela serait important ... si vous utilisez le module 'json', il vous échappera en toute sécurité. Si vous voulez bien, vous pouvez enregistrer le JSON comme une chaîne dans le format que vous voulez, marquez simplement avec SafeString et passez au modèle. – zeekay

0

La réponse précédente y ouvre notre programme pour les attaques XSS, car les chaînes incluant '' ne seront pas correctement échappées, fermant ainsi une balise parent.

1

Comme zeekay mentionné, il suffit d'utiliser la bibliothèque json intégrée python. Il produira automatiquement des données json valides. Vous devrez toujours marquer «sûr» pour django à utiliser dans les modèles, mais vous pouvez le faire en utilisant le filtre de modèle «sûr».

0

J'ai trouvé une méthode qui utilise un filtre de template personnalisé django.

Le code de filtre ressemble à ce

custom_filter.py

from django.template import Library 
from django.utils.safestring import SafeString 
import json 

register = Library() 


@register.filter("escapedict") 
def escapedict(data): 
    if not isinstance(data, dict): 
     return data 
    for key in data: 
     if isinstance(data[key], int) and not isinstance(data[key], bool): 
      data[key] = int(SafeString(data[key])) 
     else: 
      data[key] = SafeString(data[key]) 
    return json.dumps(data) 

django document

Et dans le modèle, nous utilisons le filtre comme ceci:

... 
{% load custom_filter %} 
some html 
... 
onclick="jsfunc('{{data|escapedict}}')" 
... 
some html 
... 
... 
function showdetails(data){ 
    parse data here 
} 
... 
... 
Questions connexes