Python Django多对多管理与内联表单集

Python Django多对多管理与内联表单集,python,django,django-orm,inline-formset,Python,Django,Django Orm,Inline Formset,我似乎找不到一个好办法来解决这个问题。 我有两种模式Office和People,通过带有附加字段的Contact模式建立了多对多关系 现在在我的视图中(CreateView和UpdateView),我使用内联表单集来管理关系 我的问题是UpdateView,如何更新多对多关系?我可以添加新项目。但如何删除现有的?表单集生成一个复选框DELETE,但我在代码中迷失了方向。如何使用它 一种方法是删除through模型中所有对应的行,并使用表单中提交的数据重新创建新的行,但我认为应该有一种更有效的方法

我似乎找不到一个好办法来解决这个问题。 我有两种模式
Office
People
,通过带有附加字段的
Contact
模式建立了多对多关系

现在在我的
视图中(CreateView和UpdateView),我使用内联表单集来管理关系

我的问题是
UpdateView
,如何更新多对多关系?我可以添加新项目。但如何删除现有的?表单集生成一个复选框
DELETE
,但我在代码中迷失了方向。如何使用它

一种方法是删除through模型中所有对应的行,并使用表单中提交的数据重新创建新的行,但我认为应该有一种更有效的方法来实现这一点

有人能帮忙吗

以下是我当前的代码:

def post(self, request, *args, **kwargs):
    self.object = self.get_object()
    form_class = self.get_form_class()
    form = self.get_form(form_class)
    formset = OfficeContactInline(request.POST, instance=self.object)        
    if form.is_valid() and formset.is_valid():
        self.object = form.save()
        contacts = formset.save(commit=False)
        for contact in contacts:
            contact.office = self.object
            contact.save()
        formset.save_m2m()
        return HttpResponseRedirect(self.get_success_url())
    else:
        return render(request, self.template_name, self.get_context_data(form=form, formset=formset))

我终于找到了解决问题的办法。Django 1.7的行为实际上发生了变化:
formset.save(commit=False)
不再删除已删除的项目(选中复选框)。 因此,您必须使用
formset.deleted\u对象来执行此操作:下面的工作代码

def post(self, request, *args, **kwargs):
    self.object = self.get_object()
    form_class = self.get_form_class()
    form = self.get_form(form_class)
    formset = OfficeContactInline(request.POST, instance=self.object)        
    if form.is_valid() and formset.is_valid():
        self.object = form.save()
        contacts = formset.save(commit=False)
        # New with Django 1.7
        for del_contact in formset.deleted_objects:
            del_contact.delete()

        for contact in contacts:
            contact.office = self.object
            contact.save()
        formset.save_m2m()
        return HttpResponseRedirect(self.get_success_url())
    else:
        return render(request, self.template_name, self.get_context_data(form=form, formset=formset))
这里记录了这一点: