当我使用Django模板渲染器渲染一个页面时,我可以传入一个包含各种值的字典变量,使用{{myVar}}在页面中操作它们。
是否有一种方法可以在Javascript中访问相同的变量(可能使用DOM,我不知道Django如何使变量可访问)?我希望能够根据传入的变量中包含的值使用AJAX查找详细信息。
当我使用Django模板渲染器渲染一个页面时,我可以传入一个包含各种值的字典变量,使用{{myVar}}在页面中操作它们。
是否有一种方法可以在Javascript中访问相同的变量(可能使用DOM,我不知道Django如何使变量可访问)?我希望能够根据传入的变量中包含的值使用AJAX查找详细信息。
当前回答
从Django 2.1开始,专门为这个用例引入了一个新的内置模板标记:json_script。
https://docs.djangoproject.com/en/stable/ref/templates/builtins/#json-script
新标记将安全地序列化模板值并防止XSS。
Django文档摘录:
安全地将Python对象输出为JSON,并封装在标签中, 可以与JavaScript一起使用。
其他回答
您可以组装整个脚本,其中数组变量是在字符串中声明的,如下所示:
views.py
aaa = [41, 56, 25, 48, 72, 34, 12]
prueba = "<script>var data2 =["
for a in aaa:
aa = str(a)
prueba = prueba + "'" + aa + "',"
prueba = prueba + "];</script>"
这将生成如下所示的字符串
prueba = "<script>var data2 =['41','56','25','48','72','34','12'];</script>"
获得该字符串后,必须将其发送到模板
views.py
return render(request, 'example.html', {"prueba": prueba})
在模板中,您接收到它,并以一种文学的方式将其解释为HTM代码,例如,就在需要它的javascript代码之前
模板
{{ prueba|safe }}
下面是代码的其余部分,请记住在示例中使用的变量是data2
<script>
console.log(data2);
</script>
这样就可以保持数据的类型,在本例中是一种安排
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框架来支持更复杂的变量。
有许多答案指向json_script。与人们可能认为的相反,这并不是一个万能的解决方案。
例如,当我们想要将在For循环中生成的动态变量传递给JavaScript时,最好使用data-attributes之类的东西。
点击这里查看更多细节。
一个对我有用的解决方案是在模板中使用隐藏的输入字段
<input type="hidden" id="myVar" name="variable" value="{{ variable }}">
然后以这种方式获取javascript的值,
var myVar = document.getElementById("myVar").value;
我在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>