【问题标题】:Django Many To Many Management with inline formset带有内联表单集的 Django 多对多管理
【发布时间】:2015-02-28 16:53:57
【问题描述】:

我似乎找不到解决这种情况的方法。 我有两个模型 OfficePeople 通过带有附加字段的 Contact 模型具有多对多关系。

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

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

一种方法是删除直通模型中的所有相应行,并使用从表单提交的数据重新创建新行,但我相信应该有一种更有效的方法。

有人可以帮忙吗?

这是我当前的代码:

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))

【问题讨论】:

    标签: python django django-orm inline-formset


    【解决方案1】:

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

    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))
    

    这在此处记录:https://docs.djangoproject.com/en/1.7/topics/forms/formsets/#django.forms.formsets.BaseFormSet.can_delete

    【讨论】:

      最近更新 更多