2014-10-19 254 views
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) 

回答

1

使用Javascript来计算并实时显示该字段的总值。

在你看来,你不应该做一个查询来获取两个创建OrderHeaderOrderLinesform.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

相关问题