Django中如何按ref_code分组在模板展示Transaction模型的买家、商品及数量信息
解决Django中按ref_code分组展示交易记录的问题
嘿,这个需求其实很好实现,咱们分后端数据分组和模板渲染两步来做就行:
第一步:在视图中对交易记录按ref_code分组
首先要确保同个ref_code的记录是连续的,所以先对查询集按ref_code排序,再用itertools.groupby来分组。这样能把相同ref_code的交易都归到一组里。
视图函数代码示例:
from itertools import groupby from django.shortcuts import render from .models import Transaction def transaction_list(request): # 先按ref_code排序,保证同组记录连续(groupby要求连续相同key) transactions = Transaction.objects.all().order_by('ref_code') # 按ref_code分组,整理成模板易处理的结构 grouped_data = [] for ref_code, trans_group in groupby(transactions, key=lambda t: t.ref_code): grouped_data.append({ 'ref_code': ref_code, 'transactions': list(trans_group) # 把迭代器转成列表,方便模板循环 }) return render(request, 'transactions.html', {'grouped_transactions': grouped_data})
第二步:在模板中渲染分组后的内容
拿到分组好的数据后,用两层循环就能实现你要的展示效果:外层循环遍历每个ref_code分组,先显示分组标题;内层循环遍历该分组下的每条交易记录。
模板代码示例(假设模板名为transactions.html):
{% for group in grouped_transactions %} <h3>REFERAL CODE: {{ group.ref_code }}</h3> {% for trans in group.transactions %} <p>Buyer: {{ trans.buyer.username }}, Product : {{ trans.product.name }}, Quantity: {{ trans.quantity }}</p> {% endfor %} {% endfor %}
小提醒:
- 这里假设你的
User模型用的是默认的username字段,Product模型有name字段,如果你的字段名不一样,记得对应修改模板里的字段哦。 - 一定要先排序!
itertools.groupby只会把连续的相同key的项归为一组,如果不排序,同一个ref_code的记录可能分散在不同位置,就会被分成多个组,影响展示效果。
内容的提问来源于stack exchange,提问作者Eddy Hartono




