使用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">« 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 »</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">« 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 »</a> {% endif %} </span> </div>
同时确认数据库中确实存在7条未被过滤的Order记录(比如没有被自定义Manager或查询集过滤)。
内容的提问来源于stack exchange,提问作者Truksi
相关产品推荐
相关产品推荐

