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
相关产品推荐
相关产品推荐

