对Django字段执行加法和乘法的最佳方法

2024-06-16 21:28:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个模型“Manifests”和一个表单“CreateManifestForm”。用户在CreateManifestForm中输入多行数据,这些数据被保存到Manifest模型中(逐行保存,不使用ajax或任何东西)

模型和表格中有3个关注领域-“案例”、“FOB”、“CNF”。FOB和CNF都是美元金额,所以我将用一个作为例子。我怎样才能把用户输入的离岸价格乘以箱数,然后存储这个数字呢?另外,当用户输入另一行时,我如何做相同的操作,然后将其添加到原始数字中,以便获得一个总值

型号.PY

class Manifests(models.Model):

    reference = models.ForeignKey(Orders)
    cases = models.IntegerField()
    product_name = models.ForeignKey(Products, default=None, blank=True, null=True)
    count = models.IntegerField()
    CNF = models.DecimalField(max_digits=11, decimal_places=2, default=None, blank=True, null=True)
    FOB = models.DecimalField(max_digits=11, decimal_places=2, default=None, blank=True, null=True)

    def __str__(self):
        return self.description

视图.PY

def add_manifest(request, reference_id):

    form = CreateManifestForm(request.POST or None)
    if request.method == "POST":
        if form.is_valid():
            instance = form.save(commit=False)
            try:
                order = Orders.objects.get(id=reference_id)
                instance.reference = order
            except Orders.DoesNotExist:
                pass
            instance.save()
    form = CreateManifestForm(initial={'reference': Orders.objects.get(reference=reference_id)})
    reference = request.POST.get('reference')
    manifests = Manifests.objects.all().filter(reference=reference)


    context = {
        'form': form,
        'reference_id': reference_id,
        'manifests' : manifests,
    }

    return render(request, 'add_manifest.html', context)

添加清单.HTML

{% extends 'base.html' %}

{% block body %}

  <div class="container">
    <form id="create_mani_form" method="POST">

      <br>
      <br>
      <br>
      {% csrf_token %}

        <div class="column">
          <label for="form.reference" class="formlabels">Reference ID: </label><br>
          <!-- <input type="text" value="{{ reference_id }}">-->
           {{ form.reference }}
          <br>
        </div>
        <div class="description">
        <div class="column">
          <label for="form.description" class="formlabels">Description: </label>
          <br>
          {{ form.product_name}}
        </div>
        </div>
        <div class="column">
          <label for="form.cases" class="formlabels">Cases: </label>
          <br>
          {{ form.cases }}
          <br>
        </div>
        <div class="column">
          <label for="form.count" class="formlabels">Count: </label>
          <br>
          {{ form.count }}
          <br>
          <label for="form.count" class="formlabels">CNF: </label>
          <br>
          {{ form.CNF }}
          <br>
          <label for="form.count" class="formlabels">Count: </label>
          <br>
          {{ form.FOB }}
        </div>
          <br>
          <br>


      <button type="submit" name="add_mani" style="border-color: #7395AE;">Add Line</button>
    </form>


    <br>
    <h4>Manifest</h4>

    <div class="table-responsive">
    <!--<table  id="manifest_table" class="table table-striped table-bordered table-sm " cellspacing="0"-->
    <table class="table table-striped table-bordered manifest_table" cellspacing="0" style="width="100%">

      <thead>
        <tr>
          <th style="width:2%;"</th>
          <th style="width:10%;">Ref ID</th>
          <th style="width:10%;">Cases</th>
          <th style="width:60%;">Description</th>
          <th style="width:10%;">Count</th>
          <th style="width:10%">FOB</th>
          <th style="width:10%">CNF</th>
        </tr>
      </thead>

      <tbody>

        {% for manifests in manifests %}

        <tr>
          <td>
            <a href="{#}" class="btn btn-default btn-sm" role="button">Edit</a>
          </td>
          <td>{{ manifests.reference }}</td>
          <td>{{ manifests.cases }}</td>
          <td>{{ manifests.product_name}}</td>
          <td>{{ manifests.count}}</td>
          <td>{{ manifests.FOB}}</td>
          <td>{{ manifests.CNF}}</td>
        </tr>

        {% endfor %}

      </tbody>
    </table>
    </div>
    <div class="text-center">
      <a href="{% url 'display_orders' %}" type="submit" class="btn btn-primary" name="button" align="right" style="color: #7395AE; border-color: #7395AE; background-color: #FFF;">Subit Manifest</a>
    </div>
    <!-- Trigger the modal with a button -->
    <button type="button" class="btn btn-info btn-lg" data-toggle="modal" data-target="#myModal">Open Modal</button>

    <!-- Modal -->
    <div id="myModal" class="modal fade" role="dialog">
      <div class="modal-dialog">

        <!-- Modal content-->
        <div class="modal-content">
          <div class="modal-header">
            <button type="button" class="close" data-dismiss="modal">&times;</button>
            <h4 class="modal-title">Modal Header</h4>
          </div>
          <div class="modal-body">
            <p>Some text in the modal.</p>
          </div>
          <div class="modal-footer">
            <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
          </div>
        </div>

      </div>
    </div>
  </div>



{% endblock %}

我希望看到一个只读字段或类似的属性(我猜是在模板中),它显示用户正在创建的这个特定清单的总数。有什么想法吗


Tags: brdivformidstyletablebuttonlabel
1条回答
网友
1楼 · 发布于 2024-06-16 21:28:14

可以使用计算字段注释清单对象

from django.db.models import F, ExpressionWrapper

manifests = Manifests.objects.filter(
                reference=reference
            ).annotate(
                total=ExpressionWrapper(F('cases') * F('CNF'), output_field=DecimalField())
            )

然后在模板中可以引用manifest.total

相关问题 更多 >