当我使用Django模板渲染器渲染一个页面时,我可以传入一个包含各种值的字典变量,使用{{myVar}}在页面中操作它们。
是否有一种方法可以在Javascript中访问相同的变量(可能使用DOM,我不知道Django如何使变量可访问)?我希望能够根据传入的变量中包含的值使用AJAX查找详细信息。
当我使用Django模板渲染器渲染一个页面时,我可以传入一个包含各种值的字典变量,使用{{myVar}}在页面中操作它们。
是否有一种方法可以在Javascript中访问相同的变量(可能使用DOM,我不知道Django如何使变量可访问)?我希望能够根据传入的变量中包含的值使用AJAX查找详细信息。
当前回答
我发现我们可以这样传递Django变量到javascript函数:-
<button type="button" onclick="myJavascriptFunction('{{ my_django_variable }}')"></button>
<script>
myJavascriptFunction(djangoVariable){
alert(djangoVariable);
}
</script>
其他回答
我发现我们可以这样传递Django变量到javascript函数:-
<button type="button" onclick="myJavascriptFunction('{{ my_django_variable }}')"></button>
<script>
myJavascriptFunction(djangoVariable){
alert(djangoVariable);
}
</script>
注意,如果你想将一个变量传递给外部的.js脚本,那么你需要在你的script标记之前加上另一个声明全局变量的script标记。
<script type="text/javascript">
var myVar = "{{ myVar }}"
</script>
<script type="text/javascript" src="{% static "scripts/my_script.js" %}"></script>
数据像往常一样在视图中的get_context_data中定义
def get_context_data(self, *args, **kwargs):
context['myVar'] = True
return context
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 2.1开始,专门为这个用例引入了一个新的内置模板标记:json_script。
https://docs.djangoproject.com/en/stable/ref/templates/builtins/#json-script
新标记将安全地序列化模板值并防止XSS。
Django文档摘录:
安全地将Python对象输出为JSON,并封装在标签中, 可以与JavaScript一起使用。
新的文档说使用{{mydata|json_script:"mydata"}}来防止代码注入。
这里给出了一个很好的例子:
{{ mydata|json_script:"mydata" }}
<script>
const mydata = JSON.parse(document.getElementById('mydata').textContent);
</script>