Django模板中的总计/小计

1 投票
1 回答
2103 浏览
提问于 2025-04-17 22:02

我在理解一个简单的问题时遇到了困难。如何在Django模板中计算总数和小计呢?

假设我想生成一个客户订单的报告,类似于:

Desired Report Output

    Customer1
    1   Widgets   $ 2
    1   Bobbins   $ 1
        Subtotal  $ 3

    Customer2
    2   Widgets   $ 4
    2   Bobbins   $ 2
        Subtotal  $ 6

        TOTAL     $ 9

我们假设在视图中填充一个字典

orgs = {}
orgs['Customer1'] = [
    { 'qty': 1, 'descr' : 'Widgets', 'price': 2 },
    { 'qty': 1, 'descr' : 'Bobbins', 'price': 1 },
    ]
...

还有一个这样的模板:

{% for org,orders in orgs.items %}
<p>{{ org }}
    {% for order in orders %}
    <ul>
        <li>{{ order.qty }}</li>
        <li>{{ order.descr }}</li>
        <li>{{ order.price }}</li>
    </ul>
...

有没有什么办法可以计算总数和小计呢?

我知道基本的建议是在视图中处理这些,但我不知道怎么把这些放进orgs字典里。而且根据Django的文档,使用一个平行的数据结构似乎也不太可能(https://docs.djangoproject.com/en/dev/ref/templates/api/#variables-and-lookups)。

有没有什么想法?

1 个回答

2

与其让组织的键对应一个包含多个字典的列表,不如让它变成一个字典,这个字典里有一个叫 orders 的键和另一个叫 subtotal 的键。

如果传入的是组织字典,你可以这样进行修改。

total = 0
for org in orgs:
    orders = orgs[org]
    subtotal = sum(order['qty']*order['price'] for order in orders)
    total += subtotal
    orgs[org] = {'orders': orders, 'subtotal': subtotal}

现在在你的模板中,你可以这样做:

{% for org,org_data in orgs.items %}
<p>{{ org }}
    {% for order in org_data.orders %}
    <ul>
        <li>{{ order.qty }}</li>
        <li>{{ order.descr }}</li>
        <li>{{ order.price }}</li>
    </ul>
    {% endfor %}
    Subtotal: {{ org_data.subtotal }}
</p>
{% endfor %}
<p>Total: {{total}}</p>

撰写回答