Estoy tratando de usar una etiqueta de plantilla personalizada para ejecutar una función específica en una variable que obtengo en JS dentro de mi plantilla HTML.
Aquí hay una muestra de lo que probé:
etiqueta de plantilla de Python
def calculate_km(value, arg): """ Calculate the km from the source """ args_list = eval(arg) layer_id = value return f"layer_id_is:{layer_id}, args_list:{args_list}"
entonces lo estoy usando dentro de mi bloque HTML js así:
const args_data = "[" + kmlEvent.featureData.id + "," + kmlEvent.latLng.lat + "," + kmlEvent.latLng.lng + "]"; console.log(`{{single_layer.id|calculate_km: ${args_data} }}`);
El problema aquí es agregar la variable JS dentro de la etiqueta de la plantilla, como puede ver usando args_data
dentro de la string
que debería devolver la sintaxis para la Django template
así que lo que se espera es que la línea console.log
se represente de la siguiente manera:
{{12|calculate_km:[12,Foo,123,456]}}
Pero el problema es que no lee el valor de la variable args_data
y se representa como:
{{12|calculate_km: ${args_data}}}
y por supuesto, eso devuelve un error que es:
django.template.exceptions.TemplateSyntaxError: calculate_km requires 2 arguments, 1 provided
entonces parece que ni siquiera lee el valor de args_data
La etiqueta de plantilla de Django se representa en el lado del servidor, antes de entregar la respuesta HTTP. Lo que el navegador recibe en la respuesta es solo HTML y JavaScript.
El JavaScript se ejecuta en el lado del cliente, después de que todas las etiquetas de plantilla de Django (y otros nodos) ya se hayan resuelto y representado.
Lamentablemente, no puede pasar argumentos de JavaScript a una etiqueta de plantilla de Django porque el orden de ejecución es incompatible. Deberá volver a escribir la etiqueta de su plantilla como una función de JavaScript. Dado que parece que su código está siendo activado por un evento (basado en los nombres de sus variables), es probable que no sea posible cambiar todo el código para ejecutarlo en el lado del servidor.