如何自动计算Django中的字段?

时间:2019-04-21 12:02:24

标签: jquery django

这是我的模特

class Stockdata(models.Model):
    quantity    = models.PositiveIntegerField(null=True,blank=True)
    rate        = models.DecimalField(max_digits=10,decimal_places=2,default=0.00)
    opening     = models.DecimalField(max_digits=10,decimal_places=2,default=0.00)
    stock_name  = models.CharField(max_length=32)

我想做类似的事情: opening = quantity * rate在我的Django表单模板中。

我尝试了以下方法:

<script type="text/javascript">

$(document).ready(function() {
    $('#id_Quantity').keyup(function() {
        var a = $('#id_rate').val();
        var b = $(this).val();
        $('#id_opening').val(a * b);
    });
});

</script>

但这并不是没有结果

我的模板:

            <form method="POST">

      <div class="form-group row">

                <label class="col-lg-2 col-form-label">Stock Name<i class="material-icons" style="font-size:16px;color:red">*</i></label>

                    <div class="col-lg-10">
                    {{ form.stock_name.errors }}
                        {{ form.stock_name }}
                    </div>
                </div>
           <div class="form-group row">

                <label class="col-lg-2 col-form-label">Quantity<i class="material-icons" style="font-size:16px;color:red">*</i></label>

                    <div class="col-lg-10">
                    {{ form.Quantity.errors }}
                    {{ form.Quantity }}
                    </div>
                </div>

                <div class="form-group row">

                <label class="col-lg-2 col-form-label">Rate<i class="material-icons" style="font-size:16px;color:red">*</i></label>

                    <div class="col-lg-10">
                    {{ form.rate.errors }}
                    {{ form.rate }}
                    </div>
                </div>

                <div class="form-group row">

                <label class="col-lg-2 col-form-label">Opening Balance<i class="material-icons" style="font-size:16px;color:red">*</i></label>

                    <div class="col-lg-10">
                    {{ form.opening.errors }}
                    {{ form.opening }}
                    </div>
                </div>
            </form>

有人对如何执行此操作有任何想法吗? 其实我对jquery非常陌生,因此有一些基本问题。 谢谢

1 个答案:

答案 0 :(得分:1)

我建议不要在前端执行计算并将数据发布到后端(除非您需要向用户显示opening的值)。

相反,您应该通过简单地覆盖opening方法来计算保存在Stockdata django模型中的save值。如下所示。

class Stockdata(models.Model):
    quantity    = models.PositiveIntegerField(null=True,blank=True)
    rate        = models.DecimalField(max_digits=10,decimal_places=2,default=0.00)
    opening     = models.DecimalField(max_digits=10,decimal_places=2,default=0.00)
    stock_name  = models.CharField(max_length=32)

    # you override the save method and calculate for opening
    def save(self, *args, **kwargs):
        self.opening = self.quantity * self.rate;
        super(Stockdata, self).save(*args, **kwargs)

NB 如果您仍然需要在用户输入数量值和费率值时向用户显示期初值,则需要对脚本进行一些修改:

<script type="text/javascript">
  $(document).ready(function() {
    $('#id_Quantity').keyup(function() {
        var rate = parseFloat($('#id_rate').val());
        var quantity = parseInt($(this).val(), 10);
        $('#id_opening').text(rate * quantity);
    });
  });
</script>

然后您的html部分将是:

<form method="POST">

  <div class="form-group row">

    <label class="col-lg-2 col-form-label">Stock Name<i class="material-icons"
        style="font-size:16px;color:red">*</i></label>

    <div class="col-lg-10">
      {{ form.stock_name.errors }}
      {{ form.stock_name }}
    </div>
  </div>
  <div class="form-group row">

    <label class="col-lg-2 col-form-label">Quantity<i class="material-icons"
        style="font-size:16px;color:red">*</i></label>

    <div class="col-lg-10">
      {{ form.Quantity.errors }}
      {{ form.Quantity }}
    </div>
  </div>

  <div class="form-group row">

    <label class="col-lg-2 col-form-label">Rate<i class="material-icons" style="font-size:16px;color:red">*</i></label>

    <div class="col-lg-10">
      {{ form.rate.errors }}
      {{ form.rate }}
    </div>
  </div>

  <div class="form-group row">

    <label class="col-lg-2 col-form-label">Opening Balance<i class="material-icons"
        style="font-size:16px;color:red">*</i></label>

    <div class="col-lg-10">
      <!-- opening value will be displayed here -->
      <label id="id_opening"></label>
    </div>
  </div>
</form>