0
我有两种形式的OrderHeaderForm和OrderLineForm。 OrderHeaderForm显示客户和总价格。 OrderLineForm是一个显示产品,数量,价格和总量的表单集。Django基于formset中的两个其他字段计算字段
我想计算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()
我的models.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
我views.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)