在admin Djang中添加一个额外的合计行

2024-04-25 07:11:09 发布

您现在位置:Python中文网/ 问答频道 /正文

应用程序的admin.py是:

from django.contrib import admin
from django.db.models import Subquery, Sum, OuterRef

from .models import GoodsItem, FinishedGoodsItem, SoldGoodsItem

@admin.register(SoldGoodsItem)
class SoldGoodsItemAdmin(admin.ModelAdmin):
    fields = ('date', 'goods_item', 'weight')
    list_display = ('date', 'goods_item', 'weight')

@admin.register(FinishedGoodsItem)
class FinishedGoodsItemAdmin(admin.ModelAdmin):
    fields = ('date', 'goods_item', 'weight')
    list_display = ('date', 'goods_item', 'weight')

@admin.register(GoodsItem)
class GoodsItemAdmin(admin.ModelAdmin):
    list_display = ('__str__', 'finished_good', 'sold_good', 'stock_available')

    def get_queryset(self, request):
        qs = super(GoodsItemAdmin, self).get_queryset(request)
        qs = qs.annotate(
            finished_good = Subquery(FinishedGoodsItem.objects.filter(goods_item=OuterRef('pk'))\
                .values('goods_item_id').annotate(sum=Sum('weight')).values('sum')[:1]),
            sold_good = Subquery(SoldGoodsItem.objects.filter(goods_item=OuterRef('pk'))\
                .values('goods_item_id').annotate(sum=Sum('weight')).values('sum')[:1])
        )
        return qs

    def finished_good(self, obj):
        return obj.finished_good

    def sold_good(self, obj):
        return obj.sold_good

    def stock_available(self, obj):
        finished_good = 0 if self.finished_good(obj) is None else self.finished_good(obj)
        sold_good = 0 if self.sold_good(obj) is None else self.sold_good(obj)
        return '-' if (finished_good == 0 and sold_good == 0) else finished_good - sold_good

admin.site.site_header = 'Rajeshwari Steels'

对于GoodsItemAdmin,我想在records表的底部显示一行合计。total行应该显示所有三列的合计,这三列是finished_goodsold_good和{}。
这里所有三列都使用GoodsItemAdmin中的方法显示,并通过重写get_queryset方法在queryset上进行注释。在

我在寻找解决方案时找到了this question。该问题的答案建议重写管理模板和changelist_view方法。在

请帮助我如何重写管理模板和changelist_view方法来显示queryset上带批注列的总计行。
如果有其他更好的解决办法,也让我知道。在


Tags: selfobjdateadmindefitemquerysetgood