【问题标题】:Save two instances on same model in django在 django 的同一模型上保存两个实例
【发布时间】:2021-12-27 16:50:27
【问题描述】:

在我的情况下,它是一个资金管理应用程序,任务是我想将金额 x 从资金 A 转移到资金 B,从银行转移到收银员或从 paypal acc 转移到我的银行,我将两个实例添加到同一张表(国库项目)但有不同的细节(国库)。在下面的代码中,我得到了两个实例,但是在这两个实例中,对于前国库 A,现场金库没有按照我的选择保存,它保存相同。另外,我只想填写第一张表格和第二张表格的金库,第二张表格的其他字段必须自动保存(姓名=姓名,日期=日期,借方=贷方,贷方=借方)。任何人都可以帮忙。提前致谢

型号:

class Treasury(models.Model):
    name = models.CharField(max_length=256)

class TreasuryItem(models.Model):
    treasury = models.ForeignKey('Treasury', on_delete=models.CASCADE)
    date = models.DateField(default=timezone.now)
    name = models.CharField(max_length=256)
    debit = models.DecimalField(max_digits=20, decimal_places=2, null=True, blank=True)
    credit = models.DecimalField(max_digits=20, decimal_places=2, null=True, blank=True)

表格:

class TreasuryItem1Form(ModelForm):

    class Meta:
        model = TreasuryItem
        fields = "__all__"


class TreasuryItem2Form(ModelForm):

    class Meta:
        model = TreasuryItem
        fields = "__all__"

查看:

def TreasuryItem_Create(request, pk):
    treasurys = Treasury.objects.all()
    treasury = treasurys.get(id=pk)
    form1 = TreasuryItem1Form()
    form2 = TreasuryItem2Form()
    if request.method == 'POST':
        form1 = TreasuryItem1Form(request.POST)
        form2 = TreasuryItem2Form(request.POST)
        if form1.is_valid() and form2.is_valid():
            form1.save()
            form2.save()
            return redirect('treasury_profile', pk)

【问题讨论】:

    标签: django django-models django-views django-forms django-templates


    【解决方案1】:

    您不需要两个表单实例。只需在将 id 设置为 None 后重新保存实例,即可强制在数据库中插入新的内容。

    
    def TreasuryItem_Create(request, pk):
        treasurys = Treasury.objects.all()
        treasury = treasurys.get(id=pk)
        form1 = TreasuryItem1Form()
        if request.method == 'POST':
            form1 = TreasuryItem1Form(request.POST)
            if form1.is_valid() and form2.is_valid():
                treasury_item = form1.save()
                treasury_item.id = None
                # modify any other field if need
                # treasury_item.name = 'my new name`
                treasury_item.save()
                return redirect('treasury_profile', pk)
    

    【讨论】:

    • 干得好,请提供更多细节,一审的“借方”字段等于二审的“贷方”字段,用户将只填写借方,其余的将自动完成;再次感谢
    • @youssefmohamed,您可以使用表单值轻松更新第二个实例字段:treasury_item.credit = form1.cleaned_data.get('debit') 等。
    猜你喜欢
    • 2021-06-07
    • 2015-02-27
    • 1970-01-01
    • 2016-01-24
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    • 1970-01-01
    相关资源
    最近更新 更多