【问题标题】:Django calculate field based on two other fields in formsetDjango 根据表单集中的其他两个字段计算字段
【发布时间】:2014-10-19 15:32:54
【问题描述】:

我有两个表单 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)

【问题讨论】:

    标签: python django django-forms


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2023-03-21
      • 2021-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-23
      • 1970-01-01
      • 2023-03-30
      • 2017-10-12
      相关资源
      最近更新 更多