如何将get_queryset()的值传递到get_context_data()并获取完整查询集长度?
解决Django分页下获取查询集总数量的问题
你遇到的这个问题很常见——因为ListView分页后,模板里的{{ queryset|length }}只能拿到当前页的记录数,而不是整个查询集的总数。要把完整的查询集数量传递到模板,可以这么做:
步骤1:在get_queryset()中保存完整查询集到实例属性
重写get_queryset时,别只返回查询集,把它存到当前视图的实例属性里,这样后续的get_context_data就能访问到它:
class YourStoreListView(ListView): model = Store paginate_by = 10 # 你的分页条数 template_name = "your_template.html" def get_queryset(self): # 这里写你的查询逻辑,生成完整的search_stores查询集 search_term = self.request.GET.get("search", "") self.search_stores = Store.objects.filter(name__icontains=search_term) # 返回查询集给分页组件处理 return self.search_stores
步骤2:在get_context_data()中传递总数量
接着重写get_context_data,调用父类方法拿到基础context后,把完整查询集的总数加进去:
def get_context_data(self, **kwargs): # 先获取父类处理好的context(包含分页后的查询集等) context = super().get_context_data(**kwargs) # 把完整查询集的总数添加到context里 context["total_search_count"] = self.search_stores.count() return context
步骤3:模板中使用总数量
之后在模板里,直接用{{ total_search_count }}就能拿到所有符合条件的记录总数啦,完全不受分页影响。
补充说明
- 用
count()而不是len()更高效,因为count()是通过数据库的SELECT COUNT(*)语句实现的,不会把所有数据加载到内存里; - 一定要把完整查询集存在实例属性里(比如
self.search_stores),而不是在get_context_data里重新查询一次,避免重复数据库请求。
内容的提问来源于stack exchange,提问作者Jay P.
相关产品推荐
相关产品推荐

