2017-05-09 4 views
0

Ich habe 2 Modelle in 1 Form. In dieser Form können Daten geändert werden. Für 1 Modell (Sloep_core) muss der Inhalt nur aktualisiert werden, das funktioniert. für das andere Modell (Sloep_gegevens) wird der Inhalt normalerweise aktualisiert. Nur wenn der Wert 'sloepnaam' in der Form für das Modell 'Sloep_gegevens' geändert wurde, muss der Datensatz für das Modell 'Sloep_gegevens' einen neuen Datensatz eingeben und den alten Datensatz nicht aktualisieren. Die save() muss von Update zu Insert wechseln, aber wie ??Django Multi-Modell Form, Speichern oder Aktualisieren auf einem Modell

Ich habe versucht, Soms Code zusammen zu setzen (mit einigen Suchaktionen). Ich komme zu dem Code unten, aber jetzt ist es immer ein Code einfügen. Hat jemand eine Idee, um es richtig zu machen?

model.py:

class Sloep_core(models.Model): 
     FSN_nummer = models.IntegerField(unique=True) 
     HT_nummer = models.IntegerField(unique=True, blank=True, null=True) 
     SRNL_nummer = models.IntegerField(blank=True, null=True) 
     sloep_type = models.CharField(max_length=128, blank=True) 
     werf = models.CharField(max_length=255, blank=True) 
     info = models.TextField(blank=True) 
     objects = SloepManager() 

     def __str__(self): 
       return str(self.FSN_nummer) 

class Sloep_gegevens(models.Model): 
     sloep = models.ForeignKey(Sloep_core, on_delete=models.CASCADE, default='') 
     sloepnaam = models.CharField(max_length=128) 
     thuishaven = models.CharField(max_length=128, blank=True) 
     date = models.DateField(auto_now=True) 
     __original_sloepnaam = None 

     def __init__(self, *args, **kwargs): 
       super(Sloep_gegevens, self).__init__(*args, **kwargs) 
       self.__original_sloepnaam = self.sloepnaam 

     def save(self, force_insert=False, force_update=False, *args, **kwargs): 
       if self.sloepnaam != self.__original_sloepnaam: 
         # then do this 
         force_insert = True 
       else: 
         # do that 
         force_update = True 

       super(Sloep_gegevens, self).save(force_insert, force_update, *args, **kwargs) 
       self.__original_sloepnaam = self.sloepnaam 

     class Meta: 
       ordering = ["date"] 

     def __str__(self): 
       return self.sloepnaam 

form.py:

class SloepGegevensForm(forms.ModelForm): 
     class Meta: 
       model = Sloep_gegevens 
       exclude = ['pk', 'sloep'] 

class SloepCoreForm(forms.ModelForm):   
     class Meta: 
       model = Sloep_core 
       exclude = ['pk', 'SRNL_nummer'] 

views.py:

def sloep_edit(request, pk): 
    sloep = Sloep_core.objects.get(pk=pk) 
    sloep_sg = Sloep_gegevens.objects.filter(sloep=pk).order_by('-date')[0] 
    if request.method == "POST": 
     formSG = SloepGegevensForm(request.POST) 
     formSC = SloepCoreForm(request.POST, instance=sloep) 
     if all([formSG.is_valid(), formSC.is_valid()]): 
      sloep = formSC.save() 
      SG = formSG.save(commit=False) 
      SG.sloep = sloep 
      SG.save() 
      return redirect('sloep_detail', pk=sloep.pk) 
    else: 
     formSG = SloepGegevensForm(instance=sloep_sg) 
     formSC = SloepCoreForm(instance=sloep) 
    return render(
     request, 
     'sloepen/sloep_edit.html', 
     {'formSG': formSG, 'formSC': formSC,}) 
+0

Mögliches Duplikat von [Ruft der ORM Aufruf beim Abrufen einer gespeicherten Instanz auf?] (Http://stackoverflow.com/questions/37175724/does-the-orm-call-init-when-retrieving-a-saved- instance) – e4c5

+0

ich sehe nicht, wo es diesen Link vervielfältigt. – Jeebeevee

Antwort

0

ich die Antwort für mein Problem gefunden. In der Ansicht habe ich kein Pk mit dem SloepGegevensForm im POST request.model angegeben. Ich habe geändert: formSG = SloepGegevensForm(request.POST) in formSG = SloepGegevensForm(request.POST, instance=sloep_sg)
Dies macht die Save() arbeiten.

Verwandte Themen