Хорошо, есть способ сделать это, включив добавление пары новых тегов шаблонов и расширение шаблонов администратора.
Прежде всего, в папке 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. Для получения бонусных баллов вы можете добавить следующий фрагмент JavaScript в конец файла totals_row.html
:
<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
, если вы не возражаете против потенциального снижения производительности.