Django 2列表分页实现求助,仅找到Django 1.3旧版文档
Django 2+ 列表分页实现方案
嘿,我来帮你搞定Django 2+的分页功能!其实Django自带的分页工具就非常好用,完全不用纠结旧文档~下面一步步来实现:
第一步:修改 views.py
首先导入Django的分页工具,然后在视图里添加分页逻辑:
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from django.shortcuts import render from .models import Item # 确保你导入了Item模型 def home(request): # 简化QuerySet写法:filter已经返回QuerySet,无需额外调用all() all_dress = Item.objects.filter(dress_active=True) all_good_dress = Item.objects.filter(dress_special=True) current_user = request.user # 分页核心逻辑 paginator = Paginator(all_dress, 6) # 每页显示6条数据,可根据需求修改 page_number = request.GET.get('page') # 获取URL中的page参数 try: dress_page = paginator.page(page_number) except PageNotAnInteger: # 如果页码不是整数,默认展示第一页 dress_page = paginator.page(1) except EmptyPage: # 如果页码超出有效范围,展示最后一页 dress_page = paginator.page(paginator.num_pages) context = { 'dress_page': dress_page, # 将分页后的对象传入模板 'current_user': current_user, 'all_good_dress': all_good_dress, } return render(request, 'fostania/home.html', context)
第二步:修改模板(home.html)
首先把原来遍历all_dress的代码改成遍历分页对象dress_page,然后在循环结束后添加分页导航栏:
<!-- 遍历分页后的商品列表 --> {% for item in dress_page %} <div class="card border-info" style="width: 18rem;"> <a href="{% url 'dress_details' item.pk%}"><img class="card-img-top" src="{{ item.dress_image1.url }}" alt="Card image cap"></a> <div class="card-body" align="right"> <h5 class="card-title"><a href="{% url 'dress_details' item.pk%}">{{ item.dress_name }}</a> <br>{{ item.dress_action }}<br>{{ item.dress_price }} 噩賳賷賴 </h5> <p class="card-text">丕賱賲賯丕爻 : {{ item.dress_size }} <br>{{ item.dress_city }}<br> {{ item.created_at|date:"SHORT_DATE_FORMAT" }} </p> </div> </div> <br> <br> {% endfor %} <!-- 分页导航栏 --> <div class="mt-4 d-flex justify-content-center"> <nav aria-label="Page navigation example"> <ul class="pagination"> <!-- 首页按钮 --> {% if dress_page.has_previous %} <li class="page-item"> <a class="page-link" href="?page=1" aria-label="First"> <span aria-hidden="true">« 首页</span> </a> </li> <!-- 上一页按钮 --> <li class="page-item"> <a class="page-link" href="?page={{ dress_page.previous_page_number }}" aria-label="Previous"> <span aria-hidden="true">上一页</span> </a> </li> {% endif %} <!-- 当前页码信息 --> <li class="page-item disabled"> <span class="page-link"> 第 {{ dress_page.number }} 页 / 共 {{ dress_page.paginator.num_pages }} 页 </span> </li> <!-- 下一页按钮 --> {% if dress_page.has_next %} <li class="page-item"> <a class="page-link" href="?page={{ dress_page.next_page_number }}" aria-label="Next"> <span aria-hidden="true">下一页</span> </a> </li> <!-- 末页按钮 --> <li class="page-item"> <a class="page-link" href="?page={{ dress_page.paginator.num_pages }}" aria-label="Last"> <span aria-hidden="true">末页 »</span> </a> </li> {% endif %} </ul> </nav> </div>
关键说明:
dress_page是Django的Page对象,它本身是可迭代的,所以可以直接用{% for %}遍历- 常用的
Page对象属性:has_previous:是否有上一页has_next:是否有下一页number:当前页码paginator.num_pages:总页数
- 你可以根据自己的UI需求调整分页导航的样式,上面的示例用了Bootstrap的分页组件,如果你没用Bootstrap,也可以改成纯CSS样式。
内容的提问来源于stack exchange,提问作者Ahmed Wagdi
相关产品推荐
相关产品推荐

