当我使用Django模板渲染器渲染一个页面时,我可以传入一个包含各种值的字典变量,使用{{myVar}}在页面中操作它们。

是否有一种方法可以在Javascript中访问相同的变量(可能使用DOM,我不知道Django如何使变量可访问)?我希望能够根据传入的变量中包含的值使用AJAX查找详细信息。


当前回答

有许多答案指向json_script。与人们可能认为的相反,这并不是一个万能的解决方案。

例如,当我们想要将在For循环中生成的动态变量传递给JavaScript时,最好使用data-attributes之类的东西。

点击这里查看更多细节。

其他回答

新的文档说使用{{mydata|json_script:"mydata"}}来防止代码注入。

这里给出了一个很好的例子:

{{ mydata|json_script:"mydata" }}
<script>
    const mydata = JSON.parse(document.getElementById('mydata').textContent);
</script>

对于作为文本存储在Django字段中的JavaScript对象,它需要再次成为动态插入到页面脚本中的JavaScript对象,您需要同时使用escapejs和JSON.parse():

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

Django的escapejs正确地处理引用,JSON.parse()将字符串转换回JS对象。

我在Django 2.1中使用这种方法,对我来说,这种方法是安全的(参考):

Django身边:

def age(request):
    mydata = {'age':12}
    return render(request, 'test.html', context={"mydata_json": json.dumps(mydata)})

Html:

<script type='text/javascript'>
     const  mydata = {{ mydata_json|safe }};
console.log(mydata)
 </script>

我也遇到过类似的问题,S.Lott提出的答案对我很有用。

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

然而,我想在这里指出主要的执行限制。 如果你打算把javascript代码放在不同的文件中,并将该文件包含在你的模板中。这行不通。

只有当你的主模板和javascript代码在同一个文件中,这才会起作用。 也许django团队可以解决这个限制。

从Django 2.1开始,专门为这个用例引入了一个新的内置模板标记:json_script。

https://docs.djangoproject.com/en/stable/ref/templates/builtins/#json-script

新标记将安全地序列化模板值并防止XSS。

Django文档摘录:

安全地将Python对象输出为JSON,并封装在标签中, 可以与JavaScript一起使用。