2017-05-09 30 views
0

1つのフォームに2つのモデルがあります。この形式でデータを変更することができます。 1つのモデル(Sloep_core)については、内容を更新するだけで動作します。 他のモデル(Sloep_gegevens)の場合、コンテンツnormalyが更新されます。 モデル 'Sloep_gegevens'のフォームで値 'sloepnaam'が変更された場合のみ、モデル 'Sloep_gegevens'のレコードは新しいレコードを入力する必要があり、古いレコードは更新されません。 save()はupdateからinsertに変更する必要がありますが、どうすればよいですか?Djangoマルチモデルフォーム、1つのモデルで保存または更新

私はsomsコードを(いくつかの検索アクションで)一緒に配置しようとしました。私は下のコードに来るが、今は常にコードを挿入する。誰かがそれを正しくするアイディアを持っていますか?

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

[保存されたインスタンスを取得するときにORMがinitを呼び出しますか?](http://stackoverflow.com/questions/37175724/does-the-orm-call-init-when-retrieving-a-saved-インスタンス) – e4c5

+0

私はこのリンクのどこにいないのか分かりません。 – Jeebeevee

答えて

0

私は私の問題のための答えを見つけました。このビューでは、POST request.modelのSloepGegevensFormをpkに渡しませんでした。 変更:formSG = SloepGegevensForm(request.POST)formSG = SloepGegevensForm(request.POST, instance=sloep_sg)
に変更すると、save()が機能します。

関連する問題