如何获取第一个表单数据并将该数据设置为第二个表单



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

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

这是我的模型等

模型;

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})

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文档告诉您的关于ModelForm.save()的内容。你应该尽可能多地使用这些文档,它们包含了很多例子,可以回答你的大部分问题。

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

最新更新