当我使用Django模板渲染器渲染一个页面时,我可以传入一个包含各种值的字典变量,使用{{myVar}}在页面中操作它们。
是否有一种方法可以在Javascript中访问相同的变量(可能使用DOM,我不知道Django如何使变量可访问)?我希望能够根据传入的变量中包含的值使用AJAX查找详细信息。
当我使用Django模板渲染器渲染一个页面时,我可以传入一个包含各种值的字典变量,使用{{myVar}}在页面中操作它们。
是否有一种方法可以在Javascript中访问相同的变量(可能使用DOM,我不知道Django如何使变量可访问)?我希望能够根据传入的变量中包含的值使用AJAX查找详细信息。
当前回答
{{variable}}被直接替换到HTML中。做一个查看源码;它不是一个“变量”或类似的东西。它只是渲染文本。
话虽如此,您可以在JavaScript中加入这种替换。
<script type="text/javascript">
var a = "{{someDjangoVariable}}";
</script>
这为您提供了“动态”javascript。
其他回答
我也遇到过类似的问题,S.Lott提出的答案对我很有用。
<script type="text/javascript">
var a = "{{someDjangoVariable}}"
</script>
然而,我想在这里指出主要的执行限制。 如果你打算把javascript代码放在不同的文件中,并将该文件包含在你的模板中。这行不通。
只有当你的主模板和javascript代码在同一个文件中,这才会起作用。 也许django团队可以解决这个限制。
您可以组装整个脚本,其中数组变量是在字符串中声明的,如下所示:
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>
这样就可以保持数据的类型,在本例中是一种安排
Javascript中有两件事对我有用:
'{{context_variable|escapejs }}'
及其他: 在views.py
from json import dumps as jdumps
def func(request):
context={'message': jdumps('hello there')}
return render(request,'index.html',context)
在html中:
{{ message|safe }}
对于作为文本存储在Django字段中的JavaScript对象,它需要再次成为动态插入到页面脚本中的JavaScript对象,您需要同时使用escapejs和JSON.parse():
var CropOpts = JSON.parse("{{ profile.last_crop_coords|escapejs }}");
Django的escapejs正确地处理引用,JSON.parse()将字符串转换回JS对象。
从Django 2.1开始,专门为这个用例引入了一个新的内置模板标记:json_script。
https://docs.djangoproject.com/en/stable/ref/templates/builtins/#json-script
新标记将安全地序列化模板值并防止XSS。
Django文档摘录:
安全地将Python对象输出为JSON,并封装在标签中, 可以与JavaScript一起使用。