Django中如何在模板展示关联annotated查询集的views.py变量?
解决Django模板无法显示annotated查询集的问题
你的问题核心很明确:你在代码里定义了ps这个annotated查询集,但没有把它传递给模板上下文,所以模板里的for循环根本找不到这个变量。下面是具体的解决步骤和代码修改建议:
1. 补全必要导入并传递查询集到模板
首先,你需要确保导入了Count(当前代码只导入了F,但你用到了Count('pastry')),然后在PollsListView中重写get_context_data方法,把ps添加到模板上下文里。
修改后的views.py相关部分:
from django.shortcuts import render from django.views.generic import (TemplateView,ListView, DetailView,CreateView, UpdateView,DeleteView) from django.urls import reverse_lazy from myapp.models import Pastry from myapp.forms import PastryForm from django.db.models import F, Count # 新增Count的导入 # ... 其他视图类保持不变 ... class PollsListView(ListView): model = Pastry def get_queryset(self): return Pastry.objects.all() # 新增该方法,将ps查询集传递给模板 def get_context_data(self, **kwargs): # 先获取ListView默认的上下文数据 context = super().get_context_data(**kwargs) # 把annotated查询集添加到上下文 context['ps'] = Pastry.objects.values('pastry').annotate(total=Count('pastry')) return context
2. 优化模板中的循环逻辑
你原本用嵌套循环遍历字典键值对,其实可以直接通过键访问(因为你已经清楚ps里的元素是{'pastry': ..., 'total': ...}的结构),让代码更简洁。修改pastry_list.html的相关部分:
{% extends "base.html" %} {% block content %} <div class="jumbotron"> <a href="{% url 'pastry_new' %}">New Poll</a> <h1>Voting for the favorite pastry</h1> <!-- 修改后的ps数据展示 --> <h2>投票统计:</h2> {% for item in ps %} <p>{{ item.pastry }}:{{ item.total }} 票</p> {% empty %} <p>暂无投票数据</p> {% endfor %} <!-- 原有的pastry_list循环保持不变 --> {% for pastry in pastry_list %} <div class="pastry"> <h3><a href="{% url 'pastry_detail' pk=pastry.pk %}"> {{ pastry.pastry }}</a></h3> </div> {% endfor %} </div> {% endblock %}
为什么原代码不生效?
Django的ListView默认只会自动将指定model的查询集(这里是pastry_list,对应Pastry.objects.all())添加到模板上下文。你自己定义的ps变量如果不通过get_context_data主动传递,模板是无法访问到的——这就是你打印查询集正常,但页面上看不到数据的根本原因。
内容的提问来源于stack exchange,提问作者seleniumappiumnewbie
相关产品推荐
相关产品推荐

