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

使用Django generic.ListView类时分页功能失效求助

Django分页仅显示“Page of . ”无分页链接问题

问题描述

我在Django中为订单列表实现分页功能,代码逻辑看似全部正确,但访问网页时未显示分页链接,仅显示Page of . 。当前共有7条订单数据,按设置的每页5条应该会分成2页。

相关代码

models.py

class Order(models.Model):
    date = models.DateField('Date', null=True, blank=True)
    car = models.ForeignKey(Car, on_delete=models.SET_NULL, null=True)

    ORDER_STATUS = (
        ('p', 'Processing'),
        ('o', 'Ordered'),
        ('s', 'In service'),
        ('c', 'Completed'),
        ('t', 'Taken back by customer')
    )
    status = models.CharField(max_length=1, choices=ORDER_STATUS,
                              blank=True, default='p')

    @property
    def order_total_price(self):
        order_rows = self.order_row.all()
        total_price = sum(row.total_price for row in order_rows)
        return round(total_price)

    @property
    def order_rows(self):
        return ', '.join(str(el) for el in self.order_row.all())

    def __str__(self):
        return f'{self.car}'

views.py

class OrderListView(generic.ListView):
    model = Order
    context_object_name = "orders"
    template_name = "orders.html"
    paginate_by = 5

urls.py

from django.urls import path, include
from . import views

urlpatterns = [
    path('index/', views.index, name="index"),
    path('cars/', views.cars, name='cars'),
    path('car/<int:pk>/', views.car_detail, name='car_detail'),
    path('orders/', views.OrderListView.as_view(), name='orders'),
    path('order/<int:order_id>/', views.order_detail, name='order_detail'),
    path('search/', views.search_results, name='search_results'),
    path('', views.index, name='index'),
]

orders.html

{% extends 'base.html' %}

{% block header %}Orders{% endblock %}

{% block content %}

    <div class="pagination">
        <span class="step-links">
            {% if orders.has_previous %}
                <a href="?page=1">&laquo; First</a>
                <a href="?page={{ orders.previous_page_number }}">Previous</a>
            {% endif %}

            <span class="current">
                Page {{ orders.number }} of {{ orders.paginator.num_pages }}.
            </span>

            {% if orders.has_next %}
                <a href="?page={{ orders.next_page_number }}">Next</a>
                <a href="?page={{ orders.paginator.num_pages }}">Last &raquo;</a>
            {% endif %}
        </span>
    </div>

    <h2>List of Orders</h2>
    <ul>
        {% for order in orders %}
            <li>
                <a href="{% url 'order_detail' order.id %}">
                    {{ order.car.client }} - {{ order.car.car_model.brand }}
                    {{ order.car.car_model.model }} {{ order.car.license_plate }}<br>
                </a>
            </li>
            <br>
        {% endfor %}
    </ul>

{% endblock %}

解决方法

问题根源是模板中错误地通过orders访问分页属性。Django的ListView分页后,orders只是当前页的数据列表,而分页相关的状态(如has_previous、number、paginator)都存储在默认的page_obj对象中。

修改模板中的分页代码,将所有orders替换为page_obj即可:

<div class="pagination">
    <span class="step-links">
        {% if page_obj.has_previous %}
            <a href="?page=1">&laquo; First</a>
            <a href="?page={{ page_obj.previous_page_number }}">Previous</a>
        {% endif %}

        <span class="current">
            Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
        </span>

        {% if page_obj.has_next %}
            <a href="?page={{ page_obj.next_page_number }}">Next</a>
            <a href="?page={{ page_obj.paginator.num_pages }}">Last &raquo;</a>
        {% endif %}
    </span>
</div>

同时确认数据库中确实存在7条未被过滤的Order记录(比如没有被自定义Manager或查询集过滤)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 09:43:20