如何在Django模板的JavaScript中使用"views.py"中的变量?

314 投票
19 回答
368181 浏览
提问于 2025-04-11 19:49

当我使用Django的模板渲染页面时,可以传递一个字典变量,这个变量里面包含了各种值,然后我可以在页面中用{{ myVar }}来操作这些值。

有没有办法在JavaScript中访问同样的变量呢?比如在<script></script>标签里使用(也许可以通过DOM来实现;我不太清楚Django是怎么让这些变量可用的)?我希望能够根据传入的变量中的值,通过Ajax查找一些详细信息。

19 个回答

80

对我有效的一个解决办法是使用模板中的隐藏输入字段。

<input type="hidden" id="myVar" name="variable" value="{{ variable }}">

然后用这种方式在JavaScript中获取这个值,

var myVar = document.getElementById("myVar").value;
89

注意: 请查看票据 #17419,里面讨论了在Django核心中添加类似标签的事情,以及使用这个模板标签处理用户生成的数据可能带来的XSS安全漏洞。amacneil的评论讨论了票据中提到的大部分问题。


我认为最灵活、最方便的方法是为你想在JavaScript代码中使用的变量定义一个模板过滤器。这样可以确保你的数据被正确处理,并且可以与复杂的数据结构一起使用,比如 dict(字典)和 list(列表)。

下面是一个模板过滤器的例子:

// myapp/templatetags/js.py

from django.utils.safestring import mark_safe
from django.template import Library

import json


register = Library()


@register.filter(is_safe=True)
def js(obj):
    return mark_safe(json.dumps(obj))

这个模板过滤器会把一个变量转换成JSON字符串。你可以这样使用它:

// myapp/templates/example.html

{% load js %}

<script type="text/javascript">
    var someVar = {{ some_var | js }};
</script>
402

这里的 {{variable}} 是直接放到HTML里去的。你可以查看源代码;它并不是一个“变量”或者类似的东西。它只是被渲染出来的文本。

不过,你可以把这种替换放到你的JavaScript里。

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

这样你就得到了“动态”的JavaScript代码。

撰写回答