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

Django创建数据可视化图表时JavaScript模板块报错排查

问题根因

你当前的代码存在两个直接触发报错的问题,另外编辑器飘红属于模板语法识别误报:

  • 模板标签位置错误:base.html中已经将{% block scripts %}放置在<script>标签和$(document).ready()回调内部,但是子模板results.html填充块内容时又嵌套了完整的<script>标签和重复的$(document).ready()回调,渲染后会出现script标签嵌套、JS语法结构错乱,浏览器解析时直接抛出语法错误。
  • 缺失必要DOM节点:当前脚本逻辑直接获取id为myChart的节点,如果页面中没有提前定义对应canvas元素,脚本执行时会抛出空值错误。
  • 编辑器提示误报:常规HTML/JS语法校验无法识别Django/Jinja2类模板的{% %}标签语法,会错误标记模板标签为非法JS语法,这类提示不影响模板实际渲染运行。
修复方案

两种正确写法二选一即可,不要混用:

写法1(推荐,灵活度更高)

将base.html的脚本块移到公共依赖引入之后、页面最底部,不要提前包裹<script>标签和ready回调:

<!-- 提前引入公共依赖:jQuery、Chart.js -->
<script src="/static/js/jquery.min.js"></script>
<script src="/static/js/chart.min.js"></script>

<!-- 页面公共导航、侧边栏等内容 -->

<!-- 页面正文内容块 -->
{% block content %}{% endblock %}

<!-- 页面自定义脚本块,不额外套标签 -->
{% block scripts %}{% endblock %}

对应results.html内容调整为:

{% extends "base.html" %}

{% block content %}
<!-- 必须提前定义图表对应的canvas节点 -->
<canvas id="myChart" width="800" height="400"></canvas>
{% endblock %}

{% block scripts %}
<script>
$(document).ready(function(){
    const ctx = document.getElementById('myChart').getContext('2d');
    const myChart = new Chart(ctx, {
        type: 'bar',
        data: {
            labels: ['Red', 'Blue', 'Yellow', 'Green', 'Purple', 'Orange'],
            datasets: [{
                label: '# of Votes',
                data: [12, 19, 3, 5, 2, 3],
                backgroundColor: [
                    'rgba(255, 99, 132, 0.2)',
                    'rgba(54, 162, 235, 0.2)',
                    'rgba(255, 206, 86, 0.2)',
                    'rgba(75, 192, 192, 0.2)',
                    'rgba(153, 102, 255, 0.2)',
                    'rgba(255, 159, 64, 0.2)'
                ],
                borderColor: [
                    'rgba(255, 99, 132, 1)',
                    'rgba(54, 162, 235, 1)',
                    'rgba(255, 206, 86, 1)',
                    'rgba(75, 192, 192, 1)',
                    'rgba(153, 102, 255, 1)',
                    'rgba(255, 159, 64, 1)'
                ],
                borderWidth: 1
            }]
        },
        options: {
            scales: {
                y: {
                    beginAtZero: true
                }
            }
        }
    });
});
</script>
{% endblock scripts %}

写法2(保留原有base结构)

如果你想保留base.html里提前写好的$(document).ready()包裹逻辑,就保持base.html原有代码不变,删掉results.html脚本块里多余的<script>标签和$(document).ready()嵌套,直接写核心JS逻辑即可:

{% extends "base.html" %}

{% block content %}
<canvas id="myChart" width="800" height="400"></canvas>
{% endblock %}

{% block scripts %}
const ctx = document.getElementById('myChart').getContext('2d');
const myChart = new Chart(ctx, {
    type: 'bar',
    data: {
        labels: ['Red', 'Blue', 'Yellow', 'Green', 'Purple', 'Orange'],
        datasets: [{
            label: '# of Votes',
            data: [12, 19, 3, 5, 2, 3],
            backgroundColor: [
                'rgba(255, 99, 132, 0.2)',
                'rgba(54, 162, 235, 0.2)',
                'rgba(255, 206, 86, 0.2)',
                'rgba(75, 192, 192, 0.2)',
                'rgba(153, 102, 255, 0.2)',
                'rgba(255, 159, 64, 0.2)'
            ],
            borderColor: [
                'rgba(255, 99, 132, 1)',
                'rgba(54, 162, 235, 1)',
                'rgba(255, 206, 86, 1)',
                'rgba(75, 192, 192, 1)',
                'rgba(153, 102, 255, 1)',
                'rgba(255, 159, 64, 1)'
            ],
            borderWidth: 1
        }]
    },
    options: {
        scales: {
            y: {
                beginAtZero: true
            }
        }
    }
});
{% endblock scripts %}

关于编辑器飘红的处理:如果使用PyCharm、VS Code类编辑器,安装对应模板语法支持插件、将模板文件夹标记为项目模板目录,即可消除模板标签的错误提示,这类提示本身不会影响服务端模板渲染结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 04:27:17