# admin.py def changelist_view(self, request, extra_context=None):# 调用父类的 changelist_view 方法response = super().changelist_view(request, extra_context=extra_context)# =============> 定义当前页面 需要汇总的列名nameList = ['stock_cost_total', 'stock_cost']all_columns = [field.name for field in InventoryData._meta.fields if field.name != 'id']summary_list = []totals = {name: 0 for name in nameList}if hasattr(response, 'context_data'):result_list = response.context_data['cl'].result_listfor obj in result_list:for name in nameList:totals[name] += getattr(obj, name, 0)for column in all_columns:if column in totals:summary_list.append({column: round(float(totals[column]),2)})else:summary_list.append({column: 0})if extra_context is None:extra_context = {}extra_context['summary_list'] = summary_listprint("extra_context", extra_context)# =============> 定义当前页面 需要汇总的列名返回数据:
{'summary_list': [{'wid': 0}, {'product_id': 0}, {'sku': 0}, {'seller_id': 0}, {'fnsku': 0}, {'product_total': 0}, {'product_valid_num': 0}, {'product_bad_num': 0}, {'product_qc_num': 0}, {'product_lock_num': 0}, {'stock_cost_total': 950.85}, {'quantity_receive': 0}, {'stock_cost': 18.5}, {'product_onway': 0}, {'transit_head_cost': 0}, {'average_age': 0}]}接受数据页面:change_list.html
def changelist_view(self, request, extra_context=None):# 调用父类的 changelist_view 方法,获取 responseresponse = super().changelist_view(request, extra_context=extra_context)# =============> 定义过滤条件所有数据的 需要汇总的列名nameList = ['stock_cost_total', 'stock_cost']all_columns = [field.name for field in InventoryData._meta.fields if field.name != 'id']summary_list = []totals = {name: 0 for name in nameList}if hasattr(response, 'context_data'):# 获取完整的 QuerySet(包括所有搜索筛选后的数据)full_queryset = response.context_data['cl'].queryset# 遍历整个 QuerySet 计算总和for obj in full_queryset:for name in nameList:totals[name] += getattr(obj, name, 0)# 生成 summary_listfor column in all_columns:if column in totals:summary_list.append({column: round(float(totals[column]), 2)})else:summary_list.append({column: 0})if extra_context is None:extra_context = {}# 将计算结果添加到 extra_contextextra_context['summary_list'] = summary_listprint("extra_context", extra_context)# =============> 定义过滤条件所有数据的 需要汇总的列名# 重新调用 changelist_view,传入更新后的 extra_contextresponse = super().changelist_view(request, extra_context=extra_context)return response