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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 01:18:30