Django中创建Moc实例时自动生成含10个预填充项的CheckList
Django模型自动生成初始检查项及增删控制方案
一、修改CheckList模型,自动生成10个预填充检查项
把当前CheckList.save()仅创建单个CheckListItem的逻辑,改成循环生成10个预定义内容的检查项。先准备好初始动作项列表,再在CheckList创建时批量生成:
# 预定义10个初始检查项内容,可按需修改 INITIAL_CHECK_ITEMS = [ "完成需求文档评审", "确认测试环境搭建完成", "编写核心功能单元测试", "完成接口联调", "进行性能测试", "准备用户手册初稿", "部署到预生产环境", "组织内部验收", "确认上线时间窗口", "发送上线通知" ] class CheckList(models.Model): moc = models.OneToOneField(Moc, related_name='checklist', on_delete=models.CASCADE) name = models.CharField(max_length=128, blank=True, null=True) def __str__(self): return str(self.id) def save(self, *args, **kwargs): created = not self.pk super().save(*args, **kwargs) if created: # 循环生成10个预填充检查项 for item_text in INITIAL_CHECK_ITEMS: CheckListItem.objects.create( checklist=self, action_item=item_text, # 注意:原模型中actionee_name的default='1'是字符串,建议改为整数1或指定存在的用户对象 # 若允许该字段为空,可删除default并在模型中设置blank=True, null=True actionee_name=User.objects.get(pk=1) )
二、实现CheckListItem的增删控制
1. 编写视图(views.py)
添加用于展示、添加、删除检查项的类视图:
from django.views.generic import ListView, CreateView, DeleteView from django.urls import reverse_lazy from .models import CheckList, CheckListItem # 展示指定CheckList下的所有检查项 class CheckListItemListView(ListView): model = CheckListItem template_name = 'checklist_item_list.html' context_object_name = 'items' def get_queryset(self): checklist_id = self.kwargs.get('checklist_id') return CheckListItem.objects.filter(checklist_id=checklist_id) # 添加新检查项 class CheckListItemCreateView(CreateView): model = CheckListItem fields = ['action_item', 'actionee_name', 'action_due'] template_name = 'checklist_item_form.html' def form_valid(self, form): checklist_id = self.kwargs.get('checklist_id') form.instance.checklist = CheckList.objects.get(pk=checklist_id) return super().form_valid(form) def get_success_url(self): return reverse_lazy('checklist_item_list', kwargs={'checklist_id': self.kwargs.get('checklist_id')}) # 删除检查项 class CheckListItemDeleteView(DeleteView): model = CheckListItem template_name = 'checklist_item_confirm_delete.html' def get_success_url(self): return reverse_lazy('checklist_item_list', kwargs={'checklist_id': self.object.checklist.id})
2. 配置URL(urls.py)
添加对应路由规则:
from django.urls import path from .views import CheckListItemListView, CheckListItemCreateView, CheckListItemDeleteView urlpatterns = [ # 其他已有URL... path('checklist/<int:checklist_id>/items/', CheckListItemListView.as_view(), name='checklist_item_list'), path('checklist/<int:checklist_id>/items/add/', CheckListItemCreateView.as_view(), name='checklist_item_add'), path('checklist/item/<int:pk>/delete/', CheckListItemDeleteView.as_view(), name='checklist_item_delete'), ]
3. 编写模板示例
检查项列表模板(checklist_item_list.html)
<h2>检查项列表</h2> <a href="{% url 'checklist_item_add' checklist_id=view.kwargs.checklist_id %}">添加新检查项</a> <ul> {% for item in items %} <li> {{ item.action_item }} - 负责人: {{ item.actionee_name.username }} - 截止日期: {{ item.action_due|default:"未设置" }} <a href="{% url 'checklist_item_delete' pk=item.id %}">删除</a> </li> {% empty %} <li>暂无检查项</li> {% endfor %} </ul>
添加检查项模板(checklist_item_form.html)
<h2>添加新检查项</h2> <form method="post"> {% csrf_token %} {{ form.as_p }} <button type="submit">保存</button> </form> <a href="{% url 'checklist_item_list' checklist_id=view.kwargs.checklist_id %}">返回列表</a>
删除确认模板(checklist_item_confirm_delete.html)
<h2>确认删除检查项?</h2> <p>你确定要删除 "{{ object.action_item }}" 吗?</p> <form method="post"> {% csrf_token %} <button type="submit">确认删除</button> <a href="{% url 'checklist_item_list' checklist_id=object.checklist.id %}">取消</a> </form>
三、补充说明
- 若要从Moc详情页跳转到对应检查项列表,可在Moc模板中添加链接:
{% url 'checklist_item_list' checklist_id=moc.checklist.id %} - 预填充的初始项可放到配置文件中,方便后续修改维护
- 如需支持检查项编辑,可添加
UpdateView视图,逻辑参考CreateView
内容的提问来源于stack exchange,提问作者SS_SS
相关产品推荐
相关产品推荐

