当我使用Django模板渲染器渲染一个页面时,我可以传入一个包含各种值的字典变量,使用{{myVar}}在页面中操作它们。
是否有一种方法可以在Javascript中访问相同的变量(可能使用DOM,我不知道Django如何使变量可访问)?我希望能够根据传入的变量中包含的值使用AJAX查找详细信息。
当我使用Django模板渲染器渲染一个页面时,我可以传入一个包含各种值的字典变量,使用{{myVar}}在页面中操作它们。
是否有一种方法可以在Javascript中访问相同的变量(可能使用DOM,我不知道Django如何使变量可访问)?我希望能够根据传入的变量中包含的值使用AJAX查找详细信息。
当前回答
以下是我很容易就能做到的: 我修改了模板的base.html文件,并把它放在底部:
{% if DJdata %}
<script type="text/javascript">
(function () {window.DJdata = {{DJdata|safe}};})();
</script>
{% endif %}
然后当我想在javascript文件中使用一个变量时,我创建了一个DJdata字典,并通过json将它添加到上下文:context['DJdata'] = json.dumps(DJdata)
希望能有所帮助!
其他回答
一个对我有用的解决方案是在模板中使用隐藏的输入字段
<input type="hidden" id="myVar" name="variable" value="{{ variable }}">
然后以这种方式获取javascript的值,
var myVar = document.getElementById("myVar").value;
Django 2.1+有一个很好的简单方法,使用内置的模板标签json_script实现。一个简单的例子是:
在模板中声明你的变量:
{{变量|json_script:'name'}}
然后调用你的<script> Javascript中的变量:
var js_variable = JSON.parse(document.getElementById('name').textContent);
对于像“User”这样更复杂的变量,使用Django内置的序列化器,你可能会得到类似“User类型的对象不是JSON可序列化的”这样的错误。在这种情况下,您可以使用Django Rest框架来支持更复杂的变量。
对于作为文本存储在Django字段中的JavaScript对象,它需要再次成为动态插入到页面脚本中的JavaScript对象,您需要同时使用escapejs和JSON.parse():
var CropOpts = JSON.parse("{{ profile.last_crop_coords|escapejs }}");
Django的escapejs正确地处理引用,JSON.parse()将字符串转换回JS对象。
{{variable}}被直接替换到HTML中。做一个查看源码;它不是一个“变量”或类似的东西。它只是渲染文本。
话虽如此,您可以在JavaScript中加入这种替换。
<script type="text/javascript">
var a = "{{someDjangoVariable}}";
</script>
这为您提供了“动态”javascript。
从Django 2.1开始,专门为这个用例引入了一个新的内置模板标记:json_script。
https://docs.djangoproject.com/en/stable/ref/templates/builtins/#json-script
新标记将安全地序列化模板值并防止XSS。
Django文档摘录:
安全地将Python对象输出为JSON,并封装在标签中, 可以与JavaScript一起使用。