You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django模板中遍历含动态键的嵌套字典并展示为表格

错误原因

Django模板语法不支持在变量引用中嵌套{{}}表达式,你写的ledgers.{{ledger}}不符合语法规范,因此触发TemplateSyntaxError报错。

解决方案

直接遍历字典的键值对即可实现需求,无需单独通过键去取值,修改模板中的循环部分代码如下:

{% for ledger_name, ledger_items in ledgers.items %}
    <tr>
        <td colspan="6">{{ ledger_name }}</td>
    </tr>
    {% for item in ledger_items %}
    <tr>
        <td>{{ item.voucher_no }}</td>
        <td>{{ item.date }}</td>
        <td>{{ item.description }}</td>
        <td>{{ item.debit_amount }}</td>
        <td>{{ item.credit_amount }}</td>
        <td>{{ item.balance }}</td>
    </tr>
    {% endfor %}
{% endfor %}

调用Django字典对象的.items方法可以直接同时获取每一项的键和对应的值,既符合语法要求,逻辑也更简洁。

可选优化(视图层)

你当前视图层的代码分两次遍历生成ledgers字典,还存在重复的数据库查询,可以合并为一次循环降低性能损耗:

# 替换原视图中生成ledgers的两段循环
ledgers = {}
for head in heads:
    key = head.head_name
    ledgers[key] = []
    d_vouchers = debit_vouchers.filter(account_head=head)
    c_vouchers = credit_vouchers.filter(account_head=head)
    for voucher in d_vouchers:
        balance -= voucher.amount
        ledgers[key].append({
            'date': voucher.date,
            'description': voucher.description,
            'voucher_no': voucher.voucher_serial,
            'debit_amount': voucher.amount,
            'credit_amount': 0,
            'balance': balance,
        })
    for voucher in c_vouchers:
        balance += voucher.amount
        ledgers[key].append({
            'date': voucher.date,
            'description': voucher.description,
            'voucher_no': voucher.voucher_serial,
            'debit_amount': 0,
            'credit_amount': voucher.amount,
            'balance': balance,
        })

内容的提问来源于stack exchange,提问作者Md Moksedul Alam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 23:21:03