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

Django视图返回None报错及Chart.js饼图任务统计渲染问题

问题1:视图返回None的根因

你写的context变量使用逗号分隔键值,实际生成的是Python集合,而非render方法要求的字典类型,类型不匹配触发的异常会打断视图正常返回流程,最终导致返回None。
修正写法:

context = {'counts_data': counts_data}

另外建议给Project查询添加异常捕获,避免项目ID不存在时触发未捕获异常导致同样的报错,可改用get_object_or_404方法:

from django.shortcuts import get_object_or_404

def visualisation(request, project_id):
    project = get_object_or_404(Project, id=project_id)
    # 其余逻辑

问题2:任务统计逻辑错误

你当前使用的annotate方法是为每一条Todo记录添加三个计数字段,最终得到的是所有Todo对象的查询集,每个对象的三个计数字段仅为0或1,完全不符合全局统计三个状态总数的需求。应改用aggregate方法做全局聚合统计:
修正后的统计代码:

counts_data = Todo.objects.aggregate(
    to_do_count = Count('id', filter=Q(status='to_do')),
    in_progress_count = Count('id', filter=Q(status='in_progress')),
    done_count = Count('id', filter=Q(status='done'))
)

该方法返回的是直接包含三个状态统计值的字典。

问题3:前端Chart.js配置错误

  1. 原代码中data数组循环遍历Todo对象,输出的是对象实例而非数值,且多了一个多余的尾部逗号
  2. labels配置不符合需求
    修正后的配置:
data: {
    labels: ['待完成', '进行中', '已完成'],
    datasets: [{
        label: '任务数量',
        data: [{{ counts_data.to_do_count }}, {{ counts_data.in_progress_count }}, {{ counts_data.done_count }}],
        backgroundColor: [
            'rgba(255, 99, 132, 0.2)',
            'rgba(54, 162, 235, 0.2)',
            'rgba(255, 206, 86, 0.2)'
        ],
        borderColor: [
            'rgba(255, 99, 132, 1)',
            'rgba(54, 162, 235, 1)',
            'rgba(255, 206, 86, 1)'
        ],
        borderWidth: 1
    }]
},

内容的提问来源于stack exchange,提问作者Lucas R.G

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 14:09:03