如何在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
相关产品推荐
相关产品推荐

