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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 09:09:01