【问题标题】:How to fetch first form data and set that data in second form?如何获取第一个表单数据并将该数据设置为第二个表单?
【发布时间】:2020-07-15 15:22:21
【问题描述】:

我有如下模型OfferOfferItem,我需要在同一模板页面上创建OfferOfferItem。我的问题是我想先保存offer_form 然后在itemOffer 字段上设置保存的报价记录,然后保存offeritem_form 我该怎么做?或者可能是我的模型和逻辑完全错误,如果是这样还有其他方法吗?

*我排除了HStoreField,因为我需要在同一页面保存多个OfferItems(可能我又错了我不知道)

这是我的模型等等。

模型;

class Offer(models.Model):

    offerCreate = models.DateTimeField(auto_now=False, auto_now_add=True)
    offerOwner = models.ForeignKey(User, on_delete=models.CASCADE)
    offerNumber = models.CharField(max_length = 150)
    offerCondi = models.TextField()
    offerTotal = models.FloatField()

    def __str__(self):
        return self.offerNumber

    class Meta:
        verbose_name = 'Offer'
        verbose_name_plural = 'Offers'

class OfferItem(models.Model):

    itemOffer = models.ForeignKey('sales.Offer', on_delete=models.CASCADE)
    itemName = models.CharField(max_length = 150,null=True)
    itemProduct = models.ForeignKey('products.Product', on_delete=models.CASCADE)
    itemLeadtime = models.CharField(max_length = 150)
    itemCost = models.FloatField()
    itemPrice = models.FloatField()
    itemCurrency = models.ForeignKey('products.Currency', on_delete=models.CASCADE)
    itemQuantity = models.IntegerField()
    itemOfferprice = models.FloatField()    

    def __str__(self):
        return self.itemName

    class Meta:

        verbose_name = 'OfferItem'
        verbose_name_plural = 'OfferItems'

查看;

def createofferView(request):
    offer_form = CreateOfferForm(request.POST or None)
    offeritem_form = CreateOfferItemForm(request.POST or None)
    if offer_form.is_valid() and offeritem_form.is_valid():
        offer_form.save()
        offeritem_form.save()
        messages.success(request, 'Success!')
        return redirect('offers')

    return render(request, 'sales/createoffer.html',{'offer_form':offer_form,'offeritem_form':offeritem_form})

【问题讨论】:

  • 只需将save() 的结果赋值给一个变量:offer = offer_form.save(); item = offeritem_form.save(commit=False); item.offer = offer; item.save()。看看docs for save()
  • @dirkgroten 工作得很好,只是将item.offer = offer 固定为item.itemOffer = offer 这就是所有请添加这个作为答案。非常感谢。
  • 您的字段命名约定不好。如果模型是Offer,为什么要在所有字段前加上offer(与OfferItem相同)?它使代码难以阅读:item.itemOfferoffer.offerNumber 不易阅读,itemOfferofferNumber 是什么?我推荐item.offeroffer.number 等...更清晰。
  • 注意到@dirkgroten,老实说,我是这方面的新手,并且学习得越来越多。感谢您的帮助。

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


【解决方案1】:

ModelForm.save() 方法返回已保存的实例。此外,您可以save(commit=False) 创建实例而不将其提交(保存)到数据库中。这允许您这样做:

offer = offer_form.save()
item = offeritem_form.save(commit=False)  # we don't commit yet, because we need to assign the offer first
item.itemOffer = offer
item.save()

这基本上就是django docs 告诉你的关于ModelForm.save() 的内容。您应该尽可能多地使用这些文档,它们包含许多可以回答您大部分问题的示例。

注意:在 python 中,尽量简洁(但也尽可能清晰)是一种很好的做法。你的代码应该读起来像英文句子。 item.itemOffer = offer 英语不好。 item.offer = offer 在语法上更有意义。相应地命名你的字段,不要在它们前面加上itemoffer,因为它们已经在OfferItemOffer的上下文中使用了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    • 2012-10-22
    • 1970-01-01
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    相关资源
    最近更新 更多