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配置错误
- 原代码中data数组循环遍历Todo对象,输出的是对象实例而非数值,且多了一个多余的尾部逗号
- 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
相关产品推荐
相关产品推荐

