如何在HTML中仅显示Django视图返回的字典值?
解决Django模板中仅显示aggregate聚合数值的问题
问题核心
你用aggregate(Sum('value'))得到的是字典对象(比如{'value__sum': 1831}),直接在模板中渲染会显示整个字典而非单独数值。另外你的计数变量q_total、q_open、q_paied也有问题——你写的是.count(仅引用方法),而非.count()(调用方法),这会导致模板显示方法对象而非实际计数。
方案一:在视图层直接提取数值
修改视图中聚合和计数的代码,直接取出字典里的数值,同时修正count的调用:
def list_pay(request): item = Pay.objects.all() # 修正count为count()调用,获取实际计数 q_total = Pay.objects.all().count() q_open = Pay.objects.filter(status=0).count() q_paied = Pay.objects.filter(status=1).count() # 直接提取聚合后的数值,加or 0避免无数据时返回None v_total = Pay.objects.aggregate(Sum('value'))['value__sum'] or 0 v_open = Pay.objects.filter(status=0).aggregate(Sum('value'))['value__sum'] or 0 v_paied = Pay.objects.filter(status=1).aggregate(Sum('value'))['value__sum'] or 0 data = { 'item':item, 'v_total':v_total, 'v_open':v_open, 'v_paied':v_paied, 'q_total':q_total, 'q_open':q_open, 'q_paied':q_paied } return render(request, 'pay/list_pay.html', data)
方案二:在模板层直接访问字典键
如果不想修改视图,直接在模板中通过字典键获取数值(仍建议在视图层修正count的调用):
<div class="row d-flex justify-content-center"> <h3 class="mb-3 mt-3">Lista <span class="text-success">de pagamentos</span></h3> <div class="col m-3 p-3"> <label>Total de boletos</label> <h1 class="text-primary"> {{ q_total }}</h1> <h1 class="text-primary"> {{ v_total.value__sum }}</h1> </div> <div class="col m-3 p-3"> <span>Quantidade de boletos</span> <h1 class="text-success">{{ q_paied }}</h1> <h1 class="text-success">{{ v_paied.value__sum }}</h1> </div> <div class="col m-3 p-3"> <span>Quantidade de boletos</span> <h1 class="text-danger">{{ q_open }}</h1> <h1 class="text-danger">{{ v_open.value__sum }}</h1> </div> </div>
额外优化提示
如果想让聚合字段名更清晰,可以在aggregate时指定别名:
v_total = Pay.objects.aggregate(total_amount=Sum('value'))['total_amount'] or 0
这样无论是视图层处理还是模板层访问,都能使用更直观的名称(比如模板中用{{ v_total }}或{{ v_total.total_amount }})。
内容的提问来源于stack exchange,提问作者Ricardo Ferrari Pasqualino
相关产品推荐
相关产品推荐

