Django分页器未在分类文章页显示 手动访问分页链接正常
根因排查
- 核心问题:上下文键名不匹配
视图构造上下文时,将分页得到的Page对象赋值给了键category,但模板中所有分页逻辑都基于cat_articles变量做判断。模板上下文中根本不存在cat_articles这个变量,因此{% if cat_articles.has_previous %}、{% if cat_articles.has_next %}的判断结果全部为False,分页的前进、后退按钮完全不会渲染。
模板中硬编码的三个页码项本身不受条件判断控制,无论分页对象是否存在都会渲染,但因为链接写死为#,无法实现跳转,加上上一页/下一页按钮缺失,整体呈现分页组件完全失效的状态。
手动输入分页链接可正常运行,是因为视图层的查询、分页逻辑本身没有问题,仅模板渲染分页控件时拿不到对应的分页状态对象。 - 次要问题1:分页页码硬编码
当前模板中写死了1、2、3三个页码,未根据分页对象的总页数动态生成页码列表,当实际页数与硬编码数量不一致时,会出现无效链接。 - 次要问题2:路由反向生成缺失参数
视图函数需要同时接收slug(分类唯一标识)、page(页码)两个参数才能正常响应,当前模板中反向生成链接时仅传入了页码值,未传递当前分类的slug参数,一旦分页组件正常渲染,会直接触发参数缺失的NoReverseMatch错误。
修正后代码
视图层
from django.core.paginator import Paginator from django.shortcuts import get_object_or_404, render from .models import Category def category(request, slug, page=1): cat = get_object_or_404(Category, slug=slug, status=True) articles_cat = cat.articles.filter(status='Published') paginator_cat = Paginator(articles_cat, per_page=1) cat_articles = paginator_cat.get_page(page) context = { # 键名与模板中使用的分页对象变量保持一致 "cat_articles": cat_articles, # 分类对象单独传递,供模板生成路由时获取slug "category": cat } return render(request, 'website/category.html', context)
模板层
<div class="blog-pagination"> <ul class="justify-content-center"> {% if cat_articles.has_previous %} <li> <a href="{% url 'website:category' category.slug cat_articles.previous_page_number %}"> <i class="icofont-rounded-left"></i> </a> </li> {% endif %} {# 动态生成分页页码,替代硬编码内容 #} {% for page_num in cat_articles.paginator.page_range %} <li {% if cat_articles.number == page_num %}class="active"{% endif %}> <a href="{% url 'website:category' category.slug page_num %}">{{ page_num }}</a> </li> {% endfor %} {% if cat_articles.has_next %} <li> <a href="{% url 'website:category' category.slug cat_articles.next_page_number %}"> <i class="icofont-rounded-right"></i> </a> </li> {% endif %} </ul> </div>
内容的提问来源于stack exchange,提问作者Amin Etemadi
相关产品推荐
相关产品推荐

