2017-10-24 6 views
0

Ich habe ein Inline-formset von diesem accepted answerDjango Inline-Formularsatz, das kein Zwischenmodell ohne pk löscht?

implementiert ich ein Problem habe, wenn nämlich die formset Speichern es keine Datensätze löschen nicht

Wir haben es in den formsets save method verfolgen können:

def form_valid(self, form): 
      '''Handle saving of the project membership formset 
      ''' 
      context = self.get_context_data() 
      project_memberships = context['projectmembership_formset'] 
      if project_memberships.is_valid(): 
       self.object = form.save() 
       project_memberships.instance = self.object 
       project_memberships.save() 

Und wenn wir tiefer in die save Methode gehen, erhalten wir:

def save_existing_objects(self, commit=True): 
     self.changed_objects = [] 
     self.deleted_objects = [] 
     if not self.initial_forms: 
      return [] 

     saved_instances = [] 
     forms_to_delete = self.deleted_forms 
     for form in self.initial_forms: 
      obj = form.instance 
      # If the pk is None, it means either: 
      # 1. The object is an unexpected empty model, created by invalid 
      # POST data such as an object outside the formset's queryset. 
      # 2. The object was already deleted from the database. 
      if obj.pk is None: 
       continue 
      if form in forms_to_delete: 
       self.deleted_objects.append(obj) 
       self.delete_existing(obj, commit=commit) 
      elif form.has_changed(): 
       self.changed_objects.append((obj, form.changed_data)) 
       saved_instances.append(self.save_existing(form, obj, commit=commit)) 
       if not commit: 
        self.saved_forms.append(form) 
     return saved_instances 

Was ich finde ist, dass die pk der obj leer ist und daher keine Löschung jemals passiert.

POST Daten:

'projectmembership_set-0-id': [ 
    '8' 
    ], 
    'projectmembership_set-0-user': [ 
    '1' 
    ], 
    'projectmembership_set-0-is_project_manager': [ 
    'on' 
    ], 
    'projectmembership_set-0-full_time_equivalent': [ 
    '100.00' 
    ], 
    'projectmembership_set-0-DELETE': [ 
    'on' 
    ], 
    'projectmembership_set-1-id': [ 
    '9' 
    ], 
    'projectmembership_set-1-user': [ 
    '3' 
    ], 
    'projectmembership_set-1-is_project_manager': [ 
    'on' 
    ], 
    'projectmembership_set-1-full_time_equivalent': [ 
    '100.00' 
    ], 
    'projectmembership_set-1-DELETE': [ 
    'on' 
    ], 
    'projectmembership_set-2-id': [ 
    '10' 
    ], 
    'projectmembership_set-2-user': [ 
    '7' 
    ], 
    'projectmembership_set-2-full_time_equivalent': [ 
    '50.00' 
    ], 
    'projectmembership_set-2-DELETE': [ 
    'on' 
    ], 

Warum die Objekte nicht pk haben und gelöscht werden, nicht wahr?

Antwort

0

Basierend auf den Antworten auf Class based viewINline formset

Die get_context_data mit den POST Daten in dem UpdateView Bedarf eine Instanz wird ebenfalls gegeben.

if self.request.POST: 
      context['projectmembership_formset'] = ProjectMembershipFormSet(
       self.request.POST, 
       instance=self.object 
      ) 
Verwandte Themen