Python Web 开发:Django 使用 Paginator 进行分页

1,181 阅读1分钟

Django 使用 Paginator 进行分页

# 导入 Paginator类
from django.core.paginator import Paginator
# 构建一个测试列表
test_list = [i for i in range(0,10)]
# 创建一个分页器,每页 4 条数据
p = Paginator(test_list, 4)
# 查看共有多少条数据
p.count				# 10
# 查看共有多少页,总共 1~3, 3 页,range 不包含最后一个
p.page_range		# range(1, 4)

# ------------- 第一页
# 获取第一页数据
page1 = p.page(1)
# 打印当前属于第几页
print(page1)		# <Page 1 of 4>
# 查看当前页的对象,以列表形式返回
page1.object_list	# [0, 1, 2]
# 使用 for 打印当前页的内容
for i in page1:
    print(i)
    
# ------------- 第二页
page2 = p.page(2)
# 查看是否有上一页
page2.has_previous()			# True
# 上一页是第几页
page2.previous_page_number()	# 1
# 查看是否有下一页
page2.has_next()				# True
# 下一页是第几页
page2.next_page_number()		# 3
# 当前页开始的数据
page2.start_index()				# 5
# 当前页结束的数据
page2.end_index()				# 8

# ------------- 第三页
page3 = p.page(3)
# 查看是否有下一页
page3.has_next()				# False
# 查看是否有上一页
page3.has_previous()			# True
# 上一页是第几页
page3.previous_page_number()	# 2
# 是否有其他页
page3.has_other_pages()			# True

写一个分页的后端逻辑,前提:当前已有一个数据库,数据库中有 5 条客户数据,现要求每页显示 2 条。

def guest_manage_with_pages(request):
    # 获取所有数据
    guest_list = Guest.objects.all()
    # 创建一个分页器,每页显示 2 条数据
    paginator = Paginator(guest_list, 2)
    # 接收前端传来的 page,后端进行翻页
    page = request.GET.get('page')
    # 获取指定页数据
    try:
        contacts = paginator.page(page)
    # 参数错误返回第一页数据
    except PageNotAnInteger:
        contacts = paginator.page(1)
    # 超过最大页数返回最后一页
    except EmptyPage:
        contacts = paginator.page(paginator.num_pages)
    # 传递给前端
    return render(request, 'guest_manage.html', {'user':username,'guests':contacts})

前端显示逻辑

    <div class="pagination">
        <span class="step-links">
            <!-- 如果有上一页,显示上一页的 a 链接 -->
            {% if guests.has_previous %}
            <a href="?page={{ guests.previous_page_number }}">上一页</a>
            {% endif %}
            <!-- 打印当前属于第几页 -->
            <span class="current">
                <!-- Page {{ guests.number }} of {{ guests.paginator.num_pages }} -->
                {{ guests }}
            </span>
            <!-- 如果有下一页,显示下一页的 a 链接 -->
            {% if guests.has_next %}
            <a href="?page={{ guests.next_page_number }}">下一页</a>
            {% endif %}
        </span>
    </div>

最终效果:

第一页:

image-20210531003552043

第二页:

image-20210531003646675

第三页:

image-20210531003743704