当我使用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)
希望能有所帮助!
其他回答
有许多答案指向json_script。与人们可能认为的相反,这并不是一个万能的解决方案。
例如,当我们想要将在For循环中生成的动态变量传递给JavaScript时,最好使用data-attributes之类的东西。
点击这里查看更多细节。
注意,如果你想将一个变量传递给外部的.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
{{variable}}被直接替换到HTML中。做一个查看源码;它不是一个“变量”或类似的东西。它只是渲染文本。
话虽如此,您可以在JavaScript中加入这种替换。
<script type="text/javascript">
var a = "{{someDjangoVariable}}";
</script>
这为您提供了“动态”javascript。
如果你想通过将变量作为参数直接发送给函数,那么试试这个
<input type="text" onkeyup="somefunction('{{ YOUR_VARIABLE }}')">
从前面的回答来看,安全性可以得到改进
我在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>