我有Offer
&下面的OfferItem
和我需要在同一模板页面上创建一个Offer
和OfferItem
。我的问题是,我想先保存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
在语法上更有意义。相应地命名字段,不要在它们前面加上item
或offer
,因为它们已经在Offer
的OfferItem
上下文中使用过了。