Django分类页面分页失效,提示页码非整数问题求助
Django分类页面分页问题解决方案
问题根源
CategoryView视图错误:
- 未过滤对应分类的文章,直接取了所有Post数据
- 调用
paginator.page('cats')时,把字符串'cats'当成页码传入,触发非整数类型错误 - 手动处理分页异常的逻辑冗余,Django内置的
get_page()方法可自动处理非整数、超出范围的页码
分页模板适配问题:
- 分页链接硬编码为首页路径,未指向当前分类页面
- 页码显示固定为
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
相关产品推荐
相关产品推荐

