Cuando renderizo una página usando el renderizador de plantillas de Django, puedo pasar una variable de diccionario que contiene varios valores para manipularlos en la página {{ myVar }}
.
¿Hay alguna manera de acceder a la misma variable en Javascript (quizás usando DOM, no sé cómo Django hace que las variables sean accesibles)? Quiero poder buscar detalles usando una búsqueda AJAX basada en los valores contenidos en las variables pasadas.
escapejs
existe filtro:escapejs('<>') -> u'\\u003C\\u003E'
PRECAUCIÓN Verifique el boleto # 17419 para obtener información sobre cómo agregar etiquetas similares al núcleo de Django y posibles vulnerabilidades XSS introducidas mediante el uso de esta etiqueta de plantilla con datos generados por el usuario. El comentario de amacneil analiza la mayoría de las preocupaciones planteadas en el boleto.
Creo que la forma más flexible y práctica de hacerlo es definir un filtro de plantilla para las variables que desea usar en el código JS. Esto le permite asegurarse de que sus datos se escapen correctamente y puede usarlos con estructuras de datos complejas, como
dict
ylist
. Es por eso que escribo esta respuesta a pesar de que hay una respuesta aceptada con muchos votos a favor.Aquí hay un ejemplo de filtro de plantilla:
Esta plantilla filtra convierte la variable a una cadena JSON. Puedes usarlo así:
fuente
safe
solo marca el valor como seguro, sin una conversión y escape adecuados.function myWidget(config) { /* implementation */ }
en el archivo JS y luego lo usas en algunas páginasmyWidget({{ pythonConfig | js }})
. Pero no puede usarlo en archivos JS (como notó), por lo que tiene sus limitaciones.Una solución que funcionó para mí es usar el campo de entrada oculto en la plantilla
Luego obteniendo el valor en javascript de esta manera,
fuente
A partir de Django 2.1, una nueva construida en etiqueta de plantilla se ha introducido específicamente para este caso de uso:
json_script
.https://docs.djangoproject.com/en/3.0/ref/templates/builtins/#json-script
La nueva etiqueta serializará de forma segura los valores de plantilla y protege contra XSS.
Extracto de Django docs:
fuente
Esto es lo que estoy haciendo muy fácilmente: modifiqué mi archivo base.html para mi plantilla y lo puse en la parte inferior:
luego, cuando quiero usar una variable en los archivos javascript, creo un diccionario DJdata y lo agrego al contexto mediante un json:
context['DJdata'] = json.dumps(DJdata)
¡Espero eso ayude!
fuente
Para un diccionario, primero es mejor codificar a JSON. Puede usar simplejson.dumps () o si desea convertir de un modelo de datos en App Engine, puede usar encode () de la biblioteca GQLEncoder.
fuente
Estaba enfrentando un problema similar y la respuesta sugerida por S.Lott funcionó para mí.
Sin embargo, me gustaría señalar aquí una importante limitación de implementación . Si planea poner su código javascript en un archivo diferente e incluir ese archivo en su plantilla. Esto no funcionara.
Esto funciona solo cuando la plantilla principal y el código de JavaScript están en el mismo archivo. Probablemente el equipo de django pueda abordar esta limitación.
fuente
He estado luchando con esto también. En la superficie, parece que las soluciones anteriores deberían funcionar. Sin embargo, la arquitectura django requiere que cada archivo html tenga sus propias variables renderizadas (es decir,
{{contact}}
se procesa encontact.html
, mientras que{{posts}}
va a, por ejemplo,index.html
etc.). Por otro lado,<script>
las etiquetas aparecen después de la{%endblock%}
enbase.html
de la cualcontact.html
yindex.html
heredar. Esto básicamente significa que cualquier solución que incluyaestá destinado a fallar, porque la variable y el script no pueden coexistir en el mismo archivo.
La solución simple que finalmente se me ocurrió, y funcionó para mí, fue simplemente envolver la variable con una etiqueta con id y luego referirme a ella en el archivo js, así:
y entonces:
y basta con incluir
<script src="static/js/somecode.js"></script>
enbase.html
la forma habitual. Por supuesto, esto solo se trata de obtener el contenido. Con respecto a la seguridad, solo siga las otras respuestas.fuente
.textContent
lugar de.innerHTML
, porque de lo contrario, las entidades que se codifican en HTML también formarán parte de la variable JS. Pero incluso entonces podría no reproducirse 1: 1 (no estoy seguro).Para un objeto JavaScript almacenado en un campo de Django como texto, que debe volver a convertirse en un objeto JavaScript insertado dinámicamente en el script de la página, debe usar ambos
escapejs
yJSON.parse()
:Django
escapejs
maneja la cita correctamente yJSON.parse()
convierte la cadena de nuevo en un objeto JS.fuente
Tenga en cuenta que si desea pasar una variable a un script .js externo, debe preceder su etiqueta de script con otra etiqueta de script que declare una variable global.
data
se define en la vista como de costumbre en elget_context_data
fuente
Lo uso de esta manera en Django 2.1 y trabajo para mí y de esta manera es seguro (referencia) :
Lado Django:
Lado HTML:
fuente
puede ensamblar todo el script donde su variable de matriz se declara en una cadena, de la siguiente manera,
eso generará una cadena de la siguiente manera
después de tener esta cadena, debe enviarla a la plantilla
en la plantilla la recibe e interpreta de manera literaria como código htm, justo antes del código javascript donde lo necesita, por ejemplo
y debajo de eso está el resto de su código, tenga en cuenta que la variable a usar en el ejemplo es data2
de esa manera mantendrá el tipo de datos, que en este caso es un acuerdo
fuente
aaa
solo contendrá números, de lo contrario es posible XSS (inyección de script).Hay dos cosas que me funcionaron dentro de Javascript:
y otros: en views.py
y en el html:
fuente