我正在使用标准的 django 管理模块来显示行列表。其中一列是数字字段。我想显示一个额外的“总计”行,其中大部分列为空白,除了数字列,它应该是所有对象的总数。
在管理模块中是否有一种简单的方法可以做到这一点,或者我最好为它制作一个自定义 View ?
我正在使用 Django 1.2。
最佳答案
是的,您可以通过多种方式做到这一点,但大多数 django-ist 的做法是:
首先覆盖默认的django ListView ...并给出一个新的模板文件目录
ModelAdmin.changelist_view(self, request, extra_context=None)
喜欢:
class MyModelAdmin(admin.ModelAdmin):
# A template for a very customized change view:
change_list_template = 'admin/myapp/extras/sometemplate_change_form.html'
def get_total(self):
#functions to calculate whatever you want...
total = YourModel.objects.all().aggregate(tot=Sum('total'))['tot']
return total
def changelist_view(self, request, extra_context=None):
my_context = {
'total': self.get_total(),
}
return super(MyModelAdmin, self).changelist_view(request,
extra_context=my_context)
因此,您将 ListView 上下文添加为“总计”,以保留您的总值(value)并将其传递给模板。
如果 change_list_template 将设置,django 使用该模板,否则,它使用标准 django 模板。
如果 def changelist_view(self, request, extra_context=None) 被调用,django 使用该函数创建内容,否则使用默认 django View 。
然后创建一个 admin/myapp/extras/sometemplate_change_form.html
文件并将您的 {{total}}
放在您想要的任何位置。
如何使用 override admin templates 的指南 这里是如何 override admin views
更新:我添加了一个简单的 aggregate
来计算总数。您可以对其进行编辑以根据需要进行设置。
更新 2:ModelAdmin 模板覆盖选项从 ModelAdmin.change_form_template
固定为 ModelAdmin.change_list_template
。 (谢谢你 c4urself)。是的,但是更改默认的 django 管理模板是一个非常糟糕的选择,因为它被许多其他 ModelAdmin 使用,并且如果更新相关模板可能会导致问题。
注意:
使用过滤器时,总数不会改变,请参阅下面的评论。
关于python - django-admin:添加额外的总计行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8541956/