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

如何处理带过滤查询集的Django通用ListView分页问题?

别放弃通用视图!分页失效的问题很容易解决

你的get_queryset写法完全没问题,分页失效不是因为查询集重新过滤——问题出在分页参数的命名不匹配上!

看你的模板里,分页链接用的是?sayfa=xxx作为页码参数,但Django的ListView默认会去URL里寻找名为page的参数来确定当前页码。所以当你点击分页按钮时,视图根本没收到正确的分页参数,自然一直默认显示第一页的10条数据,看起来就像分页失效了。

解决方法有两种,选一个就行:

方法1:修改视图,指定自定义分页参数名

在你的MyObjects视图中添加page_kwarg属性,告诉Django用sayfa作为分页参数:

class MyObjects(LoginRequiredMixin, ListView):
    model = AllObjects
    template_name = "my_objects.html"
    paginate_by = 10
    # 添加这一行,指定分页参数为sayfa
    page_kwarg = 'sayfa'

    def get_queryset(self, *args, **kwargs):
        queryset = super(MyObjects, self).get_queryset()
        return queryset.filter(added_by=self.request.user).order_by('-last_modified')

方法2:修改模板,使用Django默认的page参数

把模板里所有的sayfa替换成page即可,修改后的分页部分代码如下:

<nav aria-label="Page navigation">
<ul class="pagination">
<li class="page-item {% if not page_obj.has_previous %}disabled{%endif%}">
<a class="page-link" {% if page_obj.has_previous %} href="?page={{ page_obj.previous_page_number }}" {% endif %} aria-label="Previous">
<span aria-hidden="true">&laquo;</span>
</a>
</li>
{% for page in page_obj.paginator.page_range %}
{% if page == page_obj.number %}
<li class="page-item active"><a class="page-link" href="#">{{ page }}</a></li>
{% else %}
<li class="page-item"><a class="page-link" href="?page={{ page }}">{{ page }}</a></li>
{% endif %}
{% endfor %}
<li class="page-item {% if not page_obj.has_next %}disabled{%endif%}">
<a class="page-link" {% if page_obj.has_next %}href="?page={{ page_obj.next_page_number }}" {% endif %} aria-label="Next">
<span aria-hidden="true">&raquo;</span>
</a>
</li>
</ul>
</nav>

两种方法任选其一后,你的分页功能就能正常工作了——Django会自动根据页码参数对过滤后的查询集进行切片,完全不用手动处理分页逻辑。

内容的提问来源于stack exchange,提问作者艧uayip özülmez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:48:25