You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Django中结合django-filter与CBV实现分页的问题

我明白你现在遇到的问题了——分页功能完全没和django-filter的过滤结果关联起来,导致不管点分页还是筛选,要么全量显示数据,要么筛选后没法分页。咱们一步步来把这个问题解决掉:

问题根源

你的ResultView里,分页是基于ListView默认的原始模型查询集(也就是所有Results数据),而你只是在get_context_data里把过滤后的查询集传给了模板。这就导致分页和过滤结果完全脱节:分页逻辑根本不知道有过滤这回事,自然不会对过滤后的数据进行分页。

解决方案

我们需要让ListView的分页逻辑直接基于过滤后的查询集,同时确保分页链接保留当前的筛选参数,这样分页和筛选就能协同工作了。

1. 修改views.py,让分页基于过滤后的查询集

重写get_queryset方法,先初始化过滤器并获取过滤后的查询集,这样ListView的分页就会自动使用这个经过筛选的数据集:

class ResultView(ListView):
    paginate_by = 3
    model = Results
    template_name = 'results_filter.html'

    def get_queryset(self):
        # 初始化过滤器,基于原始查询集和当前请求的GET参数
        self.filter = ResultsFilter(self.request.GET, queryset=super().get_queryset())
        # 返回过滤后的查询集,让分页基于这个结果
        return self.filter.qs

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        # 把过滤器实例传到模板中
        context['filter'] = self.filter
        return context

2. 修正模板的分页链接,保留筛选参数

原来的分页链接只会传递page参数,点击后会丢失当前的筛选条件(比如important=False)。我们需要用request.GET.urlencode()来保留所有当前的GET参数,只替换page的值:

<div class="pagination">
    <span class="step-links">
        {% if page_obj.has_previous %}
            <a href="?{{ request.GET.urlencode }}&page={{ page_obj.previous_page_number }}">previous</a>
        {% endif %}
        <span class="current">
            Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
        </span>
        {% if page_obj.has_next %}
            <a href="?{{ request.GET.urlencode }}&page={{ page_obj.next_page_number }}">next</a>
        {% endif %}
    </span>
</div>

3. 顺便修正模板的小错误

你的模板里第二个filter_header的span文本写错了,应该改成“Filter by Important”:

<div class="filter_header">
    <span class="l">Filter by Important</span>
    {{filter.form.important}}
</div>

验证效果

现在你再测试:

  • 访问首页时,会自动分页显示3条数据;
  • 点击筛选链接(比如important=False)后,会显示符合条件的数据并分页;
  • 点击分页的previous/next链接时,会保留当前的筛选参数,分页逻辑正常工作。

内容的提问来源于stack exchange,提问作者Jide Koso

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:30:20