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,})
[保存されたインスタンスを取得するときにORMがinitを呼び出しますか?](http://stackoverflow.com/questions/37175724/does-the-orm-call-init-when-retrieving-a-saved-インスタンス) – e4c5
私はこのリンクのどこにいないのか分かりません。 – Jeebeevee