Передача словаря из представления Django в шаблон Django
Я пытаюсь передать следующий контекст из views.py в шаблон Django:
views.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)
home.html:
<script type="text/javascript">
var java_dict = {{ dict_1 }};
console.log(java_dict);
</script>
При этом возникает ошибка: Uncaught SyntaxError: Unexpected token '&'
После исследования я вижу, что словарь в javascript читается следующим образом:
{'key_1': ['val_11', 'val_12'], 'key_2': ['val_21', 'val_22']}
что, вероятно, означает, что символ кавычек (') читается неправильно. Как исправить эту проблему?
По умолчанию все значения в шаблонах Django экранируют символы HTML в целях безопасности. Если вы хотите использовать этот словарь в JavaScript, вам следует использовать фильтр json_script. Пожалуйста, прочитайте документацию, чтобы понять, что происходит.
Решением вашей проблемы может быть следующее:
Добавьте тег скрипта, содержащий ваш дикт, в шаблон
{{ dict_1 |json_script:"ID_OF_NEW_SCRIPT_TAG" }}Загрузите значение dict в тег скрипта (я буду использовать имя, которое было в вашем примере)
var java_dict = JSON.parse(document.getElementById('ID_OF_NEW_SCRIPT_TAG').textContent); console.log(java_dict);
Замените ID_OF_NEW_SCRIPT_TAG на любой другой идентификатор, который имеет смысл для вас.
Контекстные данные, которые вы передаете в шаблоны Django, по умолчанию экранируются в целях безопасности.
Если вы уверены в безопасности данных, вы можете сделать следующее:
views.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)
home.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>