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

Django分页异常:首页正常末页报“That page contains no results”错误

Django分页末页报错"That page contains no results"的解决方案

我看了你的代码,问题出在两个地方:模板里的下一页判断逻辑完全写反了,以及视图中EmptyPage异常的处理不符合预期,咱们一步步来修正:

1. 修正模板中的下一页逻辑

你的模板里下一页的判断条件搞反了,导致在末页时错误地尝试获取next_page_number(而末页没有下一页,调用这个属性会直接抛出EmptyPage异常)。把下一页的代码替换成下面的版本:

<div class="blog-pagination">
    <ul class="flat-pagination style1">
        {% if products.has_previous %}
        <li class="prev">
            <a href="?page={{products.previous_page_number}}" title="">
                <img src="{% static 'images/icons/left-1.png' %}" alt="">Önceki Sayfa
            </a>
        </li>
        {% else %}
        <li class="prev">
            <a href="#" title="">
                <img src="{% static 'images/icons/left-1.png' %}" alt="">Önceki Sayfa
            </a>
        </li>
        {% endif %}
        {% for i in products.paginator.page_range %}
            {% if products.number == i %}
            <li class="active">
                <a href="?page={{i}}" class="waves-effect" title="">{{i}}</a>
            </li>
            {% else %}
            <li>
                <a href="?page={{i}}" class="waves-effect" title="">{{i}}</a>
            </li>
            {% endif %}
        {% endfor %}
        <!-- 修正后的下一页逻辑 -->
        {% if products.has_next %}
        <li class="next">
            <a href="?page={{products.next_page_number}}" title="">
                Sonraki Sayfa
                <img src="{% static 'images/icons/right-1.png' %}" alt="">
            </a>
        </li>
        {% else %}
        <li class="next">
            <a href="#" title="">
                Sonraki Sayfa
                <img src="{% static 'images/icons/right-1.png' %}" alt="">
            </a>
        </li>
        {% endif %}
    </ul>
    <div class="clearfix"></div>
</div>

核心变化:

  • 先判断products.has_next(是否存在下一页),而不是has_previous
  • 当没有下一页时,直接显示不可点击的按钮,避免调用不存在的next_page_number

2. 修正视图中的EmptyPage异常处理

当前代码在遇到超出总页数的请求时,会跳转到第1页,这不符合常规分页逻辑(应该跳转到最后一页),同时也可能导致一些意外的页码问题。修改视图里的EmptyPage分支:

def index(request):
    categories = Category.objects.filter(parent_category=None)
    product_list = Product.objects.filter(is_deleted=False).order_by('created_at')
    paginator = Paginator(product_list, 1) # Show 1 product per page
    page = request.GET.get("page",1)
    try:
        products = paginator.page(page)
    except PageNotAnInteger:
        products = paginator.page(1)
    except EmptyPage:
        # 修正:跳转到最后一页,而不是第1页
        products = paginator.page(paginator.num_pages)
    context = {
        'products': products,
        'categories': categories
    }
    return render(request, 'product/urunler.html', context)

问题原因解释

  • 模板里的错误逻辑:在末页时,products.has_previous是True(因为存在上一页),所以会进入第一个分支尝试获取next_page_number,但末页没有下一页,Django的next_page_number()方法会直接抛出EmptyPage异常,也就是你看到的"That page contains no results"
  • 视图的异常处理:原本的逻辑会把超出范围的页码跳转到首页,这不符合用户预期,修正后会自动跳转到最后一页,提升用户体验

这样修改后,你的分页功能就能正常工作了,首页和末页都能正确显示,不会再抛出异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:52:07