Estoy tratando de pasar el siguiente contexto de views.py a una plantilla de Django:
vistas.py:
def home(request): context = { 'dict_1': {'key_1': ['val_11', 'val_12'], 'key_2': ['val_21', 'val_22']} } return render(request, 'app/home.html', context)casa.html:
<script type="text/javascript"> var java_dict = {{ dict_1 }}; console.log(java_dict); </script>Esto arroja un error: error de sintaxis no detectado: token inesperado '&'
Al investigar, veo que el diccionario en javascript se lee de la siguiente manera:
{'key_1': ['val_11', 'val_12'], 'key_2': ['val_21', 'val_22']}lo que probablemente significa que el carácter de comillas (') se lee incorrectamente. ¿Cómo soluciono este problema?
Los datos de contexto que pasa a las plantillas de Django se escapan de forma predeterminada, por motivos de seguridad.
Si está seguro de que los datos están seguros, puede hacer esto:
vistas.py
import json def home(request): # Use JSON dump so that it will be a data that can be loaded in javascript context = { 'dict_1': json.dumps({ 'key_1': ['val_11', 'val_12'], 'key_2': ['val_21', 'val_22'] }) } return render(request, 'app/home.html', context)inicio.html
<script type="text/javascript"> var java_dict = {{ dict_1| safe }}; // Actually solve your problem. Don't escape the data. console.log(java_dict); </script>De forma predeterminada, todos los valores en las plantillas de Django escapan de los caracteres HTML por motivos de seguridad. Si desea usar este diccionario en JavaScript, debe usar el filtro json_script . Por favor, lea los documentos para entender lo que está pasando.
Una solución a tu problema sería:
Agregue la etiqueta de secuencia de comandos que contiene su dict a la plantilla
{{ dict_1 |json_script:"ID_OF_NEW_SCRIPT_TAG" }}Cargue el valor dict en su etiqueta de secuencia de comandos (usaré el nombre que tenía en su ejemplo)
var java_dict = JSON.parse(document.getElementById('ID_OF_NEW_SCRIPT_TAG').textContent); console.log(java_dict);Reemplace ID_OF_NEW_SCRIPT_TAG con cualquier ID que tenga sentido para usted.