2011-06-08 25 views
5

Tengo una variable que contiene JSON que necesito pasar a una plantilla. Lo estoy definiendo como una variable y luego lo paso a la plantilla con éxito. Sin embargo, necesito el formato para reemplazar las comillas con ", pero está reemplazando con '. Esto está causando problemas con el servicio que "estoy pasando esto aUso de JSON en la plantilla django

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

Aquí está la forma en que se avecina en la plantilla:.

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

alguna idea de cómo conseguir que se utilice " en su lugar?

Respuesta

12

uso SafeString:

from django.utils.safestring import SafeString 

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

Gracias . Me estoy dando cuenta del problema principal. Cuando estoy configurando la variable, Python está cambiando mis comillas dobles a comillas simples. Esa es la raíz del problema. Para este servicio, necesito que sean comillas dobles. Ideas? – Brenden

+0

Estoy perplejo por qué eso importaría ... si usas el módulo 'json' salvará todo por ti. Sin embargo, si lo desea, puede guardar el JSON como una cadena en el formato que desee, simplemente márquelo con 'SafeString' y pase a la plantilla. – zeekay

0

La respuesta anterior y se abre nuestro programa para ataques XSS, ya que las cadenas que incluyen '' no se escaparán correctamente, cerrando así una etiqueta principal.

1

Como mencionó Zeekay, solo usa la biblioteca json incorporada de python. Automáticamente dará salida a datos json válidos. Igualmente tendrá que marcarlo como "seguro" para que django lo use en las plantillas, pero puede hacerlo usando el filtro de plantilla "seguro".

0

Encontré un método que utiliza un filtro de plantilla personalizada django.

El código del filtro se parece a esto

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

Y en la plantilla, se utiliza el filtro de la siguiente manera:

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