You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Django模板语言变量传递至JavaScript文件

解决Django中JS文件引用静态资源路径的问题

问题分析

你当前的写法无效,核心原因是Django输出的静态路径没有正确转义成合法的JS字符串,导致TEST变量未被正确定义。比如{{ test }}直接输出images/some_image.png时,JS会把它当成标识符而非字符串,引发语法错误,后续JS自然无法识别这个变量。

可行解决方案

1. 修正全局变量的定义(最简单的修复)

在HTML的script标签里,给Django输出的内容加上引号,并使用escapejs过滤器处理特殊字符,避免语法错误和XSS风险:

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <!-- 头部元信息与样式引用 -->
</head>
<body>
    <!-- 页面主体内容 -->
</body>
<script>
    // 用引号包裹路径,通过escapejs转义特殊字符
    const TEST = "{{ test|escapejs }}";
</script>
<script src="{% static 'setup.js' %}"></script>
<script src="{% static 'main.js' %}"></script>
</html>

这样TEST会被正确定义为字符串变量,后续setup.js里的函数就能正常访问它。

2. 用HTML data属性传递(更规范的方式)

把静态路径存入HTML元素的data属性中,JS通过DOM读取,这种方式更符合前端规范,也更安全:

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <!-- 头部元信息与样式引用 -->
</head>
<!-- 将静态路径存入body的data属性 -->
<body data-test-image="{% static 'images/some_image.png' %}">
    <!-- 页面主体内容 -->
</body>
<script src="{% static 'setup.js' %}"></script>
<script src="{% static 'main.js' %}"></script>
</html>

然后在setup.js中读取:

function add_misc_buttons() {
    // 从data属性获取静态路径
    const TEST = document.body.dataset.testImage;
    var btn_create_log = L.easyButton("<img src='" + TEST + "' style='width: 32px; height: 32px;'/>", function (btn, map) {
        console.log("TODO Send debug information to the developer");
        window.location.href = "mailto:admin@example.com?body=THIS%20IS%20A%20TEST";
    });
    // 其他按钮逻辑
}

3. 将JS文件作为Django模板处理(不推荐,仅作备选)

如果需要在JS文件中直接使用Django模板标签,可以把JS文件重命名为setup.js.html,然后在HTML中用{% include %}引入:

<script>
{% include 'setup.js.html' %}
</script>

在setup.js.html里就可以直接用{% static %}标签:

function add_misc_buttons() {
    var btn_create_log = L.easyButton("<img src='{% static 'images/some_image.png' %}' style='width: 32px; height: 32px;'/>", function (btn, map) {
        console.log("TODO Send debug information to the developer");
        window.location.href = "mailto:admin@example.com?body=THIS%20IS%20A%20TEST";
    });
    // 其他按钮逻辑
}

注意:这种方式会让JS文件失去静态缓存的优势,且增加服务器渲染压力,仅适合特殊场景。

安全提醒

无论用哪种方式,都要避免直接输出未转义的用户数据,防止XSS攻击。使用escapejs过滤器或data属性的方式,能有效降低安全风险。

内容的提问来源于stack exchange,提问作者rbaleksandar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 02:17:51