Django分页has_next、has_previous方法始终返回false问题
问题根源
has_next()/has_previous()是Django分页Page对象的方法,你模板里调用这两个方法的customers变量根本不是分页后的Page实例,自然拿不到正确结果。
你使用的SingleTableView是django-tables2提供的类视图,和原生ListView的上下文逻辑不同:你设置的context_object_name = 'customers'对应的是未分页的原始模型查询集,本身不存在这两个分页方法。而Django模板语言遇到变量不存在的属性/方法时会静默返回空值,被if判断识别为False,所以你看不到报错,但判断块永远不会渲染。SingleTableView开启分页后,会自动把携带分页状态的当前页Page实例存到上下文的page_obj变量中,不会挂载到你自定义的customers变量上。
修复方法
二选一即可:
方法1:直接修改模板,使用默认的page_obj变量
不需要改视图代码,直接把模板里的分页判断从customers换成page_obj即可:
<div class="pagination"> <span class="step-links"> {% if page_obj.has_next %} <p>HAS NEXT</p> {% endif %} {% if page_obj.has_previous %} <p>HAS PREVIOUS</p> {% endif %} </span> </div>
列表渲染部分遍历customers的逻辑不需要改动,不影响正常数据展示。
方法2:手动修改上下文,把Page实例绑定到customers变量
如果你确实要在customers变量上调用分页方法,重写视图的get_context_data方法即可,修改views.py:
class TableView(ExportMixin, SingleTableView): model = Customer table_class = CustomerTable template_name = 'admin_pages/user_admin_page.html' context_object_name = 'customers' paginate_by = 3 def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) # 将当前分页Page对象赋值给customers变量 context['customers'] = context['page_obj'] return context
改完后原有模板代码不需要调整就能正常工作。
额外排查项
如果修改后仍有问题,检查两点:
- 确认没有自定义
get_queryset方法时手动切片了查询集,会导致分页器计算总条数错误 - 确认没有在
CustomerTable的配置或者RequestConfig参数里单独设置了per_page,覆盖了类里的paginate_by = 3配置
内容的提问来源于stack exchange,提问作者Ahmet Yılmaz
相关产品推荐
相关产品推荐

