Variables de plantilla Django y Javascript


Cuando renderizo una página usando el renderizador de plantilla Django, puedo pasar una variable de diccionario que contiene varios valores para manipularlos en la página usando {{ myVar }}.

¿Hay alguna forma de acceder a la misma variable en Javascript (quizás usando el DOM, no se como Django hace accesibles las variables)? Quiero poder buscar detalles usando una búsqueda AJAX basada en los valores contenidos en las variables pasadas.

Author: arogachev, 2008-11-18

8 answers

El {{variable}} se sustituye directamente en el HTML. Hacer una fuente de vista; no es una "variable" ni nada parecido. Es solo texto renderizado.

Dicho esto, puedes poner este tipo de sustitución en tu JavaScript.

<script type="text/javascript"> 
   var a = "{{someDjangoVariable}}";
</script>

Esto le da javascript "dinámico".

 223
Author: S.Lott,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-02 16:36:26

PRECAUCIÓN Check ticket #17419 para la discusión sobre la adición de una etiqueta similar en Django core y posibles vulnerabilidades XSS introducidas mediante el uso de esta etiqueta de plantilla con datos generados por el usuario. Comment de amacneil discute la mayoría de las preocupaciones planteadas en el ticket.


Creo que la forma más flexible y práctica de hacer esto 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 escapan correctamente y puede usarlo con estructuras de datos complejas, como dict y list. 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:

// myapp/templatetags/js.py

from django.utils.safestring import mark_safe
from django.template import Library

import json


register = Library()


@register.filter(is_safe=True)
def js(obj):
    return mark_safe(json.dumps(obj))

Este filtro de plantilla convierte la variable en cadena JSON. Puedes usarlo así:

// myapp/templates/example.html

{% load js %}

<script type="text/javascript">
    var someVar = {{ some_var | js }};
</script>
 43
Author: Yaroslav Admin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-28 10:57:19

Una solución que funcionó para mí es usar el campo de entrada oculto en la plantilla

<input type="hidden" id="myVar" name="variable" value="{{ variable }}">

Entonces obteniendo el valor en javascript de esta manera,

var myVar = document.getElementById("myVar").value;
 37
Author: bosco-,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-13 01:15:07

Para un diccionario, es mejor codificar primero a JSON. Puedes usar simplejson.dumps() o si desea convertir desde un modelo de datos en App Engine, puede usar encode () de la biblioteca de GQLEncoder.

 8
Author: jamtoday,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-20 08:19:31

Cuando la variable es devuelta por Django convierte todas las comillas en &quot;. Usar {{someDjangoVariable|safe}} causa un error de Javascript.

Para arreglar esto use Javascript .replace:

<script type="text/javascript"> 
    var json = "{{someDjangoVariable}}".replace(/&quot;/g,"\"")
</script>
 7
Author: Jon Sakas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-07 03:22:00

Esto es lo que estoy haciendo muy fácilmente: He modificado mi base.archivo html para mi plantilla y ponlo en la parte inferior:

{% if DJdata %}
    <script type="text/javascript">
        (function () {window.DJdata = {{DJdata|safe}};})();
    </script>
{% endif %}

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 que ayude!

 6
Author: Alexis Parakian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-13 12:36:43

Me enfrentaba a un problema similar y la respuesta sugerida por S. Lott funcionó para mí.

<script type="text/javascript"> 
   var a = "{{someDjangoVariable}}"
</script>

Sin embargo, me gustaría señalar limitación importante de aplicación aquí. Si está planeando poner su código javascript en un archivo diferente e incluir ese archivo en su plantilla. Esto no funcionará.

Esto solo funciona cuando la plantilla principal y el código javascript están en el mismo archivo. Probablemente el equipo de django pueda abordar esta limitación.

 3
Author: Conquistador,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-07 17:03:39

Para un objeto JavaScript almacenado en un campo Django como texto, que necesita convertirse de nuevo en un objeto JavaScript insertado dinámicamente en el script on-page, debe usar escapejs y JSON.parse():

var CropOpts = JSON.parse("{{ profile.last_crop_coords|escapejs }}");

El escapejs de Django maneja las citas correctamente, y JSON.parse() convierte la cadena de nuevo en un objeto JS.

 0
Author: shacker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-07 19:25:23