如何在Django中修改Todo待办模型的状态值实现任务状态流转
Django待办清单状态修改功能修复方案
核心错误点
- 上下文对象语法错误:所有视图中定义的
context使用逗号分隔键值,实际生成的是Python集合而非字典,模板无法正常读取绑定变量 - 状态更新后未重定向:修改任务状态后仍渲染当前操作页面,没有跳转回任务列表页,页面无法加载最新的任务状态数据
- 任务查询未关联项目:
drag视图查询不同状态的任务时,没有关联当前项目ID,会展示所有项目的任务数据 - 缺少异常捕获与表单校验:直接使用
get查询数据库对象,ID不存在时会直接抛出500错误,且未校验表单合法性就执行状态更新操作
修正后代码
views.py
# 顶部先导入所需工具 from django.shortcuts import get_object_or_404, redirect def add_to_progress(request, todo_id, project_id): # 用get_object_or_404捕获不存在的对象 todo = get_object_or_404(Todo, id=todo_id) project = get_object_or_404(Project, id=project_id) if request.method != 'POST': form = dragTodoForm() else: form = dragTodoForm(request.POST) # 增加表单合法性校验 if form.is_valid(): Todo.objects.filter(id=todo_id).update(status='in_progress') # 修改完成后重定向回任务列表页 return redirect('drag', project_id=project_id) # 修正context为字典格式,键值用冒号分隔 context = {'form': form, 'todo': todo, 'project': project} return render(request, 'todo_lists/new_progress.html', context) def add_to_done(request, todo_id, project_id): todo = get_object_or_404(Todo, id=todo_id) project = get_object_or_404(Project, id=project_id) if request.method != 'POST': form = dragTodoForm() else: form = dragTodoForm(request.POST) if form.is_valid(): Todo.objects.filter(id=todo_id).update(status='done') return redirect('drag', project_id=project_id) context = {'form': form, 'todo': todo, 'project': project} return render(request, 'todo_lists/new_done.html', context) def drag(request, project_id): project = get_object_or_404(Project, id=project_id) # 过滤任务时关联当前项目 todo = Todo.objects.filter(status='to_do', project=project) progress = Todo.objects.filter(status='in_progress', project=project) done = Todo.objects.filter(status='done', project=project) context = {'todo': todo, 'progress': progress, 'done': done, 'project': project} return render(request, 'todo_lists/project.html', context)
其他优化建议
- models.py中
Todo类的__str__方法建议返回self.name而非self.status,方便后台管理界面区分不同任务 - 前端提交POST请求时需要携带Django的
csrf_token,否则会被拦截报错 - 如果是拖拽交互场景,也可以改用AJAX请求修改状态,无需跳转页面即可刷新列表
内容的提问来源于stack exchange,提问作者Lucas R.G
相关产品推荐
相关产品推荐

