好的,所以有一种方法可以做到这一点,包括添加几个新的模板标签和扩展管理模板。
首先,在应用的templatetags 文件夹中,创建一个包含模板标签的admin_totals.py 文件以创建总计行:
from django.template import Library
register = Library()
def totals_row(cl):
total_functions = getattr(cl.model_admin, 'total_functions', {})
totals = []
for field_name in cl.list_display:
if field_name in total_functions:
values = [getattr(i, field_name) for i in cl.result_list]
totals.append(total_functions[field_name](values))
else:
totals.append('')
return {'cl': cl, 'totals_row': totals}
totals_row = register.inclusion_tag("myapp/totals_row.html")(totals_row)
那么您需要myapp/totals_row.html 中所述行的模板(无论您的模板在哪里):
<table id="result_totals">
<tfoot>
<tr>
{% for total in totals_row %}<td>{{ total }}</td>{% endfor %}
</tr>
</tfoot>
</table>
然后你需要将它连接到一个继承自 Django 默认的自定义管理模板中,例如myapp/mymodel_admin.html:
{% extends "admin/change_list.html" %}
{% load admin_totals %}
{% block result_list %}
{{ block.super }}
{% totals_row cl %}
{% endblock %}
最后,将其连接到应用程序中 admin.py 文件的配置中:
class MyModelAdmin(ModelAdmin):
list_display = ('name', 'date', 'numerical_awesomeness')
total_functions = {'numerical_awesomeness': sum}
change_list_template = 'myapp/mymodel_admin.html'
这应该为您的新模型连接到自定义管理模板,显示总计行。如果您愿意,还可以使用 sum 以外的其他摘要函数对其进行扩展。
还剩下一点:总计行实际上不在结果表中,因为这需要对 Django 管理模板进行一些相当粗糙的复制和粘贴。对于奖励积分,您可以在 totals_row.html 文件的底部添加以下 JavaScript:
<script type="text/javascript">
django.jQuery('#result_list').append(django.jQuery('#result_totals tfoot')[0])
django.jQuery('#result_totals').remove()
</script>
一个警告:所有这些将只反映当前显示的项目的总数,而不是现有的所有项目。解决此问题的一种方法是将list_per_page 设置为ModelAdmin 类中的某个大得无法使用的数字,如果您不介意潜在的性能影响的话。