2015-01-02 4 views
1

Я не могу найти good способ решить эту ситуацию. У меня есть две модели Office и People с отношением «многие ко многим» через модель Contact с дополнительными полями.Django Many To Many Управление с помощью встроенного набора форм

Теперь в моем 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)) 

ответ

0

я наконец нашел решение моей проблемы. На самом деле происходит изменение поведения с 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