具有内联表单集的 Django 多对多管理
Django Many To Many Management with inline formset
我似乎找不到好的方法来解决这种情况。
我有两个模型 Office
和 People
通过具有附加字段的 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))
我终于找到了解决问题的方法。 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))
我似乎找不到好的方法来解决这种情况。
我有两个模型 Office
和 People
通过具有附加字段的 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))
我终于找到了解决问题的方法。 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))