【问题标题】:Django multi model form, save or update on one modelDjango多模型表单,在一个模型上保存或更新
【发布时间】:2017-05-09 13:21:12
【问题描述】:

我在 1 种形式中有 2 个模型。在这种形式的数据可以改变。 对于 1 个模型(Sloep_core),内容只需更新,这是有效的。 对于其他模型(Sloep_gegevens),内容通常会更新。 只有当模型“Sloep_gegevens”的表格中的值“sloepnaam”发生变化时,模型“Sloep_gegevens”的记录才必须输入新记录,而不是更新旧记录。 save() 必须从更新更改为插入,但是如何?

我尝试将 soms 代码放在一起(通过一些搜索操作)。我来到下面的代码,但现在它总是插入代码。有人有想法把它做对吗?

模型.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,})

【问题讨论】:

标签: python django django-models django-forms


【解决方案1】:

我找到了问题的答案。在视图中,我没有在 POST request.model 中使用 SloepGegevensForm 进行 pk。 我改了:formSG = SloepGegevensForm(request.POST)变成formSG = SloepGegevensForm(request.POST, instance=sloep_sg)
这使得 save() 工作。

【讨论】:

    猜你喜欢
    • 2017-09-08
    • 1970-01-01
    • 2020-05-18
    • 2020-08-21
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多