【问题标题】:Multiply two fields in django form and populate third filed with the result将 django 表单中的两个字段相乘并用结果填充第三个字段
【发布时间】:2020-01-30 14:54:41
【问题描述】:

我正在我的 django 应用程序中创建一个表单,如下所示:

views.py

@method_decorator([login_required, client_required], name='dispatch')
class MaterialRequestFormView(CreateView):
    model = MaterialRequest
    template_name = 'packsapp/client/materialRequestForm.html'
    fields = "__all__"

    def form_valid (self, form):
        product = form.save(commit=False)
        product.save()
        messages.success(self.request, 'The material request was created with success!')
        return redirect('client:mat_req_table')

models.py

class MaterialRequest(models.Model):
    owner = models.ForeignKey(Client, on_delete=models.CASCADE, related_name='allotment_sales')
    flow = models.ForeignKey(Flow, on_delete=models.CASCADE, related_name='flow')
    kit = models.ForeignKey(Kit, on_delete=models.CASCADE, related_name='kit')
    quantity = models.IntegerField(default=0)
    is_allocated = models.BooleanField(default=False)

    quantity_p1 = models.IntegerField(default=0)
    quantity_p2 = models.IntegerField(default=0)
    quantity_p3 = models.IntegerField(default=0)
    quantity_p4 = models.IntegerField(default=0)
    quantity_p5 = models.IntegerField(default=0)

html

 <h2>Material Request Form</h2>

    <div class="row">
        <div class="col-md-6 col-sm-8 col-12">
            <form method="post" id="MaterialRequestForm" data-kit-url="{% url 'employee:ajax_load_kit' %}"
                  data-product-url="{% url 'employee:ajax_load_product' %}"
                  novalidate>
                {% csrf_token %}
                {{ form|crispy }}
                <button type="submit">Save</button>
            </form>
        </div>
    </div>

    <div id="products-table">

    </div>

    <script>

        $("#id_flow").change(function () {
            console.log("function running");
            var url = $("#MaterialRequestForm").attr("data-kit-url");
            var flowId = $(this).val();

            $.ajax({

                url: url,
                data: {
                    'flow': flowId
                },
                success: function (data) {
                    $("#id_kit").html(data);
                    console.log(data);
                }
            });

        });
    </script>

    <script>

        $("#id_kit").change(function () {
            console.log("function running");
            var url = $("#MaterialRequestForm").attr("data-product-url");
            var kitId = $(this).val();

            $.ajax({

                url: url,
                data: {
                    'kit': kitId
                },
                success: function (data) {
                    $("#products-table").html(data);
                }
            });

        });
    </script>

ajax是为了获取表格。

我可以更改它,以便当我输入数量时,它将表中的 std quantity 乘以该值并将其填充到相应的列中?

图片更清楚:

表是这样创建的:

<tbody>
    {% for product in products %}
    <tr>
        <td>{{ product.id }}</td>
        <td>{{ product.product_name }}</td>
        {% for i in quantities %}
            {% if forloop.counter == forloop.parentloop.counter %}
                <td id="q1">{{ i }}</td>
            {% endif %}
        {% endfor %}
    {% endfor %}
    </tr>
    </tbody>

为了简化:将QuantityStd Qty 相乘并填充Quantity p1

【问题讨论】:

    标签: javascript jquery django django-templates


    【解决方案1】:

    看起来您想在提交数据之前在客户端执行此操作。正如您可能怀疑的那样,最好使用javascript 完成此操作。由于您已经在使用jquery,我建议您查看change 处理程序:https://api.jquery.com/change/

    您将使用raw data 监听元素的变化,然后计算新值并填充动态值。上面的文档有几个例子。

    那么如何找出元素的 ID?在您的浏览器中使用开发人员网络工具(通常,right click &gt; inspect element 可以解决问题)。通常,只要您不更改字段名称,这不会更改,但如果您愿意,它们也可以重写。只需创建一个实际的表单(或模型表单)。

    一切顺利!

    【讨论】:

      【解决方案2】:

      您可以通过使用 jquery 轻松做到这一点。 给forms.py中的字段赋予id,

      例如,#std 是 std 的 id,#quantity 是数量字段。

       $('#quantity').change(function(){
           std = $('#std').val();
           quantity = $('#quantity').val();
           x = parseInt(std) * parseInt(quantity);
           // Now assign x to your respective field 
       });
      

      因此动态值将被更改,然后您可以使用 django 表单或其他方式简单地保存它。

      希望这会有所帮助!

      【讨论】:

      • $('#quantity').change(function()$('#quantity').val();.. 两个地方的关键字相同?
      • 只是一个解释逻辑的例子,你可以创建一个 const 来捕获 id 然后继续相同的逻辑
      猜你喜欢
      • 2020-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多