Ok, do đó, có một cách để làm điều này, liên quan đến việc thêm vào một vài thẻ mẫu mới và mở rộng mẫu quản trị viên.
Trước hết, trong thư mục của ứng dụng của bạn templatetags
, bạn tạo một tập tin admin_totals.py
chứa một mẫu thẻ để tạo ra một hàng tổng:
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)
Sau đó, bạn cần mẫu cho hàng nói trong myapp/totals_row.html
(bất cứ nơi nào các mẫu của bạn là):
<table id="result_totals">
<tfoot>
<tr>
{% for total in totals_row %}<td>{{ total }}</td>{% endfor %}
</tr>
</tfoot>
</table>
Sau đó, bạn cần để dây đó vào một mẫu tùy chỉnh quản trị kế thừa từ mặc định của Django, chẳng hạn như myapp/mymodel_admin.html
:
{% extends "admin/change_list.html" %}
{% load admin_totals %}
{% block result_list %}
{{ block.super }}
{% totals_row cl %}
{% endblock %}
Cuối cùng, bạn dây đó vào cấu hình trong tập tin admin.py
bạn trong ứng dụng của bạn:
class MyModelAdmin(ModelAdmin):
list_display = ('name', 'date', 'numerical_awesomeness')
total_functions = {'numerical_awesomeness': sum}
change_list_template = 'myapp/mymodel_admin.html'
Đó nên dây trong tùy chỉnh mẫu quản trị cho mô hình mới của bạn, hiển thị dòng tổng số. Bạn cũng có thể mở rộng nó với các chức năng tóm tắt khác ngoài sum
, nếu bạn muốn.
Một điểm nhỏ còn lại: hàng tổng cộng không thực sự nằm trong bảng kết quả, vì điều đó sẽ yêu cầu sao chép và dán các mẫu quản trị Django khá gnarly. Đối với điểm thưởng, bạn có thể thêm vào smidge sau của hoạt Javascript để dưới cùng của totals_row.html
tập tin của bạn:
<script type="text/javascript">
django.jQuery('#result_list').append(django.jQuery('#result_totals tfoot')[0])
django.jQuery('#result_totals').remove()
</script>
Một caveat: tất cả điều này sẽ chỉ phản ánh tổng cho các mục đang hiển thị, chứ không phải cho tất cả các mục trong sự tồn tại. Một cách chung quanh việc này là đặt list_per_page
thành một số lớn bất thường trên lớp ModelAdmin
của bạn, nếu bạn không nhớ đến lần truy cập hiệu suất tiềm năng.
Chỉ cần đảm bảo: Bạn có nghĩa là tổng số tiền cho tất cả các đối tượng _on trang hiện tại hay _all các đối tượng trong cơ sở dữ liệu_? –
@ lazerscience: ý tôi là đối tượng hiện đang hiển thị (vì vậy nếu bạn áp dụng bộ lọc nó sẽ chỉ hiển thị các mục đã lọc) – Claudiu