我有两个表单 OrderHeaderForm 和 OrderLineForm。 OrderHeaderForm 显示客户和总价。 OrderLineForm 是一个显示产品、数量、价格和总计的表单集。
我正在尝试计算 OrderLineForm 中的行总数(数量 * 价格)。最好在调整数量或价格时重新计算总数,但我不知道如何创建和显示此计算。任何关于如何实现这样的事情的方向性提示或提示将不胜感激。
编辑:我让它工作了,请参阅下面编辑的代码,但在我看来,这是计算表单字段的“肮脏”方式。而且此时的计算仅在 POST 之后发生。关于进行此计算的更清晰和/或实时的方式有什么建议吗?
models.py 中的新代码:
def linetotalprice(self):
linetotalprice = self.orderline_product_price * self.orderline_quantity
return linetotalprice
views.py 中的新代码
if form.is_valid() and formset.is_valid():
saveform = form.save(commit=False)
saveform.save()
formset.save()
orderheader = OrderHeader.objects.get(pk=orderid.pk)
orderlines = OrderLine.objects.filter(orderheader=orderid)
orderheader.orderheader_total_price = 0
for orderline in orderlines:
orderline.orderline_total_price = orderline.linetotalprice()
orderheader.orderheader_total_price += orderline.linetotalprice()
orderline.save()
orderheader.save()
我的模型.py
class OrderHeader(models.Model):
customer = models.ForeignKey(Customer)
orderheader_total_price = models.DecimalField()
def __unicode__(self):
return smart_unicode(self.pk)
class OrderLine(models.Model):
orderheader = models.ForeignKey(OrderHeader)
product = models.ForeignKey(Product)
material = models.ForeignKey(ProductMaterial)
orderline_quantity = models.DecimalField()
orderline_product_price = models.DecimalField()
orderline_total_price = models.DecimalField()
def __unicode__(self):
return smart_unicode(self.pk)
def linetotalprice(self):
linetotalprice = self.orderline_product_price * self.orderline_quantity
return linetotalprice
我的观点.py
if request.method == 'POST':
form = OrderHeaderForm(request.POST, instance=orderid)
formset = OrderLineFormSet(request.POST,instance=orderid)
if form.is_valid() and formset.is_valid():
form.save()
formset.save()
orderheader = OrderHeader.objects.get(pk=orderid.pk)
orderlines = OrderLine.objects.filter(orderheader=orderid)
orderheader.orderheader_total_price = 0
for orderline in orderlines:
orderline.orderline_total_price = orderline.linetotalprice()
orderheader.orderheader_total_price += orderline.linetotalprice()
orderline.save()
orderheader.save()
messages.success(request, 'Order saved')
else:
messages.error(request, 'Order save error, please check fields below')
else:
form = OrderHeaderForm(instance=orderid)
formset = OrderLineFormSet(instance=orderid)
最佳答案
使用Javascript实时计算并显示该字段值中的总计。
在您看来,您不应该执行查询来获取创建的 OrderHeader
和 OrderLines
,form.save()
返回此实例
做:
OrderHeader = form.save()
OrderLines = formset.save()
我更喜欢
for orderline in orderlines:
orderline.orderline_total_price = orderline.linetotalprice()
orderheader.orderheader_total_price += orderline.orderline_total_price // avoid recalculating, use that value calculated just before
orderline.save()
//orderheader.save() avoid saving each time for this model
orderheader.save() // saving one time :)
您也可以更改 linetotalprice 函数以直接返回:
def linetotalprice(self):
return self.orderline_product_price * self.orderline_quantity
并将 orderline_total_price 默认值设置为 0
关于python - Django根据表单集中的其他两个字段计算字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26452103/