如何在Django表单中嵌套内联表单集?

17 投票
1 回答
15306 浏览
提问于 2025-04-16 14:55

我希望这个问题还没有被问过,但我想知道是否可以有一个普通的基于类的表单,用来处理一个对象,同时在里面嵌套一个内联表单集,用来编辑与这个对象相关的其他对象。

比如说,我有一个联系人模型

class Contact(models.Model):
    ...


还有一个沟通模型

class Communication(models.Model):
   contact = models.ForeignKey(Contact)


我想要一个联系人表单,并在里面嵌套一个内联表单集,用来管理与这个联系人相关的沟通记录。

这样做是否可能,还是说我在做无用的梦呢?

补充:我知道后台管理面板可以做到这一点,但我该如何在视图中实现呢?

1 个回答

18

当然是可以的——你觉得管理员是怎么做到的呢?

你可以看看这个内联表单集的文档

在评论后编辑 当然,你需要创建并显示父表单和嵌套的表单集。可以像这样:

def edit_contact(request, contact_pk=None):
    if contact_pk:
        my_contact = Contact.objects.get(pk=contact_pk)
    else:
        my_contact = Contact()
    CommunicationFormSet = inlineformset_factory(Contact, Communication)
    if request.POST:
        contact_form = ContactForm(request.POST, instance=my_contact)
        communication_set = CommunicationFormSet(request.POST,
                                                 instance=my_contact)
        if contact_form.is_valid() and communication_set.is_valid():
            contact_form.save()
            communication_set.save()
    else:
        contact_form = ContactForm(instance=my_contact)
        communication_set = CommunicationFormSet(instance=my_contact)
 
    return render_to_response('my_template.html', 
                              {'form': contact_form, 'formset':communication_set})

而模板可以简单到这样的程度:

<form action="" method="POST">
  {{ form.as_p }}
  {{ formset }}
</form>

不过你可能会想在显示上稍微详细一些。

撰写回答