如何处理带过滤查询集的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">«</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">»</span> </a> </li> </ul> </nav>
两种方法任选其一后,你的分页功能就能正常工作了——Django会自动根据页码参数对过滤后的查询集进行切片,完全不用手动处理分页逻辑。
内容的提问来源于stack exchange,提问作者艧uayip özülmez
相关产品推荐
相关产品推荐

