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
相关产品推荐
相关产品推荐

