Django中如何将待办任务从Todo列表转移至Progress列表
解决方案
一、先修正现有models.py的错误
你当前的模型代码存在两个会直接影响功能实现的问题:
- 两个模型的
__str__方法都调用了不存在的self.text属性,运行时会触发属性不存在错误,需替换为实际存在的self.name字段 - Progress模型的
name字段设置为外键关联Todo,若你删除原Todo数据,由于on_delete=models.CASCADE配置,关联的Progress数据也会被自动删除,完全不符合移动任务的需求,需要把该字段改为和Todo一致的CharField类型,直接存储任务名称
修正后的models.py参考:
from django.db import models import datetime # 此处默认你已经正确定义了Project模型 class Todo(models.Model): project = models.ForeignKey(Project, on_delete=models.CASCADE) name = models.CharField(max_length=20) start_date = models.DateTimeField(default=datetime.datetime.now) due_date = models.DateTimeField(default=datetime.datetime.now) def __str__(self): return self.name[:60] + "..." class Progress(models.Model): project = models.ForeignKey(Project, on_delete=models.CASCADE) # 改外键为普通CharField存储任务名称 name = models.CharField(max_length=20) start_date = models.DateTimeField(default=datetime.datetime.now) due_date = models.DateTimeField(default=datetime.datetime.now) def __str__(self): return self.name
二、views.py实现任务移动逻辑
使用Django事务装饰器保证操作原子性,避免出现只删除待办任务未创建进行中任务、或者只创建了进行中任务未删除待办任务的数据不一致问题:
from django.db import transaction from django.shortcuts import get_object_or_404, redirect from .models import Todo, Progress @transaction.atomic def move_todo_to_progress(request, todo_id): # 获取要移动的待办任务,不存在则返回404 todo = get_object_or_404(Todo, id=todo_id) # 复制待办任务字段创建进行中任务 Progress.objects.create( project = todo.project, name = todo.name, start_date = todo.start_date, due_date = todo.due_date ) # 删除原待办任务 todo.delete() # 操作完成后跳转回任务列表页,此处替换为你自己的列表页路由名 return redirect('todo_list')
三、配套路由配置(urls.py)
from django.urls import path from . import views urlpatterns = [ # 你的其他路由 path('move-to-progress/<int:todo_id>/', views.move_todo_to_progress, name='move_to_progress'), ]
在待办列表页要触发移动操作时,直接调用对应路由即可,示例前端调用代码:
<a href="{% url 'move_to_progress' todo_id=todo.id %}">移至进行中</a>
内容的提问来源于stack exchange,提问作者Lucas R.G
相关产品推荐
相关产品推荐

