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

Django分类页面分页失效,提示页码非整数问题求助

Django分类页面分页问题解决方案

问题根源

  1. CategoryView视图错误:

    • 未过滤对应分类的文章,直接取了所有Post数据
    • 调用paginator.page('cats')时,把字符串'cats'当成页码传入,触发非整数类型错误
    • 手动处理分页异常的逻辑冗余,Django内置的get_page()方法可自动处理非整数、超出范围的页码
  2. 分页模板适配问题:

    • 分页链接硬编码为首页路径,未指向当前分类页面
    • 页码显示固定为1,未动态获取当前页码和总页数
    • lastpage变量未定义,导致“最后一页”链接失效
    • 模板使用的变量名page_obj和分类视图传入的category_posts不统一,无法复用分页逻辑

修复步骤

1. 修正CategoryView视图

更新views.py中的CategoryView,实现分类过滤+标准分页逻辑:

def CategoryView(request, cats):
    # 过滤对应分类的文章(若Post模型的category是字符串字段,将category__title改为category即可)
    category_posts = Post.objects.filter(category__title=cats)
    paginator = Paginator(category_posts, 5)  

    # 获取page参数,用get_page自动处理异常(非整数/空页自动返回合法页码)
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)

    return render(request, 'categories.html', {'page_obj': page_obj, 'cats': cats})

2. 适配pagination.html模板

修改分页模板,生成分类页面的正确链接,并修复变量问题:

<div class="container mt-3">
<nav aria-label="Page navigation example">
  <ul class="pagination">
    {% if page_obj.has_previous %}
      <li class="page-item">
        <a class="page-link" href="{% url 'category' cats %}?page=1">First</a>
      </li>
      <li class="page-item">
        <a class="page-link" href="{% url 'category' cats %}?page={{ page_obj.previous_page_number }}">Previous</a>
      </li>
    {% endif %}

    <!-- 显示当前页码/总页数 -->
    <li class="page-item disabled">
      <span class="page-link">
        Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}
      </span>
    </li>

    {% if page_obj.has_next %}
      <li class="page-item">
        <a class="page-link" href="{% url 'category' cats %}?page={{ page_obj.next_page_number }}">Next</a>
      </li>
      <li class="page-item">
        <a class="page-link" href="{% url 'category' cats %}?page={{ page_obj.paginator.num_pages }}">Last</a>
      </li>
    {% endif %}
  </ul>
</nav>
</div>

3. 调整categories.html循环变量

由于视图现在传入的分页对象是page_obj,模板中的文章循环需改为遍历page_obj.object_list:

{% for post in page_obj.object_list %}
  <!-- 原文章卡片代码保持不变 -->
{% endfor %}

关键说明

  • paginator.get_page()会自动处理页码异常:若页码为非整数则返回第1页,若页码超出范围则返回最后一页,无需手动写try-except逻辑
  • 统一分页变量名:首页和分类页都使用page_obj,实现分页模板的复用
  • 分类链接生成:通过{% url 'category' cats %}生成当前分类的基础URL,再拼接?page=xxx参数,确保分页操作始终停留在当前分类页面

内容的提问来源于stack exchange,提问作者Singh Pannu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 04:30:56