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

Django中Master-Detail-Child结构单页CRUD应用开发求助

Django三层关联表单页CRUD开发指南(适配Bootstrap 5)

一、模型层核心实现

  • 用ForeignKey建立层级关联,明确on_delete规则(如CASCADE级联删除,按需调整),通过related_name简化反向查询
  • 示例代码:
    # 主表
    class Master(models.Model):
        name = models.CharField(max_length=100)
        # 其他业务字段
    
    # 明细表(关联主表)
    class Detail(models.Model):
        master = models.ForeignKey(Master, on_delete=models.CASCADE, related_name='details')
        item_name = models.CharField(max_length=100)
        # 其他业务字段
    
    # 子表(关联明细表)
    class Child(models.Model):
        detail = models.ForeignKey(Detail, on_delete=models.CASCADE, related_name='children')
        sub_item = models.CharField(max_length=100)
        # 其他业务字段
    

二、表单层嵌套处理

  • 基于ModelForm,用inlineformset_factory生成关联表的表单集,支持动态增删行
  • 示例代码:
    from django.forms import inlineformset_factory
    
    # 明细表表单集(绑定主表)
    DetailFormSet = inlineformset_factory(Master, Detail, fields=['item_name'], extra=1, can_delete=True)
    # 子表表单集(绑定明细表)
    ChildFormSet = inlineformset_factory(Detail, Child, fields=['sub_item'], extra=1, can_delete=True)
    

三、视图层逻辑整合

  • 单页CRUD需同步处理三层表的验证与保存,以创建场景为例:
    def master_create(request):
        if request.method == 'POST':
            master_form = MasterForm(request.POST)
            detail_formset = DetailFormSet(request.POST, instance=master_form.instance)
            if master_form.is_valid() and detail_formset.is_valid():
                master = master_form.save()
                # 循环处理每个明细及对应的子表
                for detail_form in detail_formset:
                    if detail_form.cleaned_data:
                        detail = detail_form.save(commit=False)
                        detail.master = master
                        detail.save()
                        # 处理子表表单集
                        child_formset = ChildFormSet(request.POST, instance=detail)
                        if child_formset.is_valid():
                            child_formset.save()
                return redirect('master_list')
        else:
            master_form = MasterForm()
            detail_formset = DetailFormSet()
        return render(request, 'master_create.html', {'master_form': master_form, 'detail_formset': detail_formset})
    
  • 编辑场景需先获取主表实例,再初始化对应层级的表单集

四、Bootstrap 5单页适配技巧

  • 用card组件包裹主表、明细、子表模块,保持页面结构清晰
  • 借助collapse组件或JS实现“点击明细展开子表”的交互,避免页面冗余
  • 给表单控件添加form-control类,删除按钮用btn btn-danger样式,统一视觉风格
  • 编写简单JS动态添加表单集行:通过修改表单集隐藏的TOTAL_FORMS字段值,实现行的动态新增

内容的提问来源于stack exchange,提问作者GSReddy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 04:01:12