如何使用 Django 进行分页

Django自带的分页插件

    现象这样的一个问题  ,分页是不是有规律的,是个什么样的规律?,

    假如我们对每页的数据固定显示20条  是什么样的呢?

    pageSize=20 每页多少条

    page=7 页码

每页条数(pageSize)

页码

每页数据

10

1

0-10

10

2

10-20

10

7

60-70

10

n

(N-1)*pageSize-n*pageSize

                  是不是这样?这就是最基本的分页方式

         最基本的分页思路

def list_students(request):
    if request.method == "GET":
        page = request.GET.get("page") #获取页码
        page_size = request.GET.get("page_size") #获取每页条数
        if not page: #设置默认页码为1
            page = 1
        if not page_size: #设置默认每页5
            page_size = 5
        page = int(page) #防止url直接传过来字符串的页码
        page_size = int(page_size) #防止url直接传过来字符串的页码
        start = (page-1)*page_size #页码数据开头的索引
        end = page*page_size  #页码数据结尾的索引
    students = Student.objects.order_by("id") #排序查询
    lenth = len(students) #获取长度
    page_num = lenth/page_size #计算页码范围
    if page_num != int(page_num): #判断页码是否为整数
        page_num += 1
    page_num = int(page_num)
    page_range = range(1,page_num+1) #页码范围
    data = students[start:end] #截取数据
    return render(request,"stu_list.html",{“data”:data,”page_range”:page_range})

使用django的分页插件进行分页

1、查询所有的数据

2、将数据传入分页的函数

3、调用具体页的数据

from django.core.paginator import Paginator

def list_students(request):
    if request.method == "GET":
        page = request.GET.get("page")
        page_size = request.GET.get("page_size")
        if not page:
            page = 1
        if not page_size:
            page_size = 5
        page = int(page)
        all_data = Student.objects.all() #查询所有的数据 --->1<---
        all_page = Paginator(all_data,int(page_size)) #将数据和单页条数放到Paginator里面  all_data = Student.objects.all() #查询所有的数据 --->2<---

        data = all_page.page(page) #获取具体页的数据 --->3<---
    return render(request,"stu_list.html",locals())
 

#基于分页实例
<P>
    <p>
        +++++++++++++++++++++总条数数+++++++++++++++++++++++++++
        <br>{{ all_page.count }}
    </p>


    <p>
        +++++++++++++++++++++总页数+++++++++++++++++++++++++++
        <br>{{ all_page.num_pages }}
    </p>

    <p>
        +++++++++++++++++++++页码范围+++++++++++++++++++++++++++
        <br>{{ all_page.page_range }}
    </p>
</P>
#基于当前分页
<p>
    <p>
        +++++++++++++++++++++当前页具体数据+++++++++++++++++++++++++++
        <br>{{ data.object_list }}
    </p>
    <p>
        +++++++++++++++++++++当前页码+++++++++++++++++++++++++++
        <br>{{ data.number }}
    </p>
    <p>
        +++++++++++++++++++++当前是否有上一页+++++++++++++++++++++++++++
        <br>{{ data.has_previous }}<br>
        +++++++++++++++++++++当前是否有下一页+++++++++++++++++++++++++++
        <br>{{ data.has_other_pages }}
    </p>
    <p>
        +++++++++++++++++++++开始索引+++++++++++++++++++++++++++
        <br>{{ data.start_index }}<br>
        +++++++++++++++++++++结束索引+++++++++++++++++++++++++++
        <br>{{ data.end_index }}
    </p>
</p>

高级分页思路

Django查询本身是有惰性的,all并不是将所有的数据查询出来,只有在排序或者截取的时候,才会 具体查询。

查询 第1页到第5页,数据库只查询前50条数据,

查询 第6页的时候,会查询50-100。

首先编写实例代码

"""

page_size = 10

当我们查询第1-5页的时候,不对所有数据进行查询,只查询前50条,也就是5页

#page 1 select_range 0-50 return_range 1-10 r_n = 1 s_n = 1

#page 2 select_range 0-50 return_range 10-20 r_n = 2 s_n = 1

#page 3 select_range 0-50 return_range 20-30 r_n = 3 s_n = 1

#page 4 select_range 0-50 return_range 30-40 r_n = 4 s_n = 1

#page 5 select_range 0-50 return_range 40-50 r_n = 5 s_n = 1

#page 6 select_range 50-100 return_range 0-10 r_n = 1 s_n = 2

#page 7 select_range 50-100 return_range 10-20 r_n = 2 s_n = 2

#page 8 select_range 50-100 return_range 20-30 r_n = 3 s_n = 2

#page 9 select_range 50-100 return_range 30-40 r_n = 4 s_n = 2

#page n (s_n-1)*50-s_n*50

"""

total = list(range(103))

while True:
    page = int(input(">>>"))

    if page%5 == 0:
        s_n = int(page/5)
        r_n = 5
    else:
        s_n = int(page / 5)+1
        r_n = page%5
    select_start = (s_n-1)*50
    select_end = s_n*50
    select_range = total[select_start:select_end]
    return_start = (r_n-1)*10
    return_end = r_n*10
    return_range = select_range[return_start:return_end]

    page_range = [3,4,5,6,7]
    if page <= 3:
        page_range = range(1,6)
    else:
        page_range = range(page-2,page+3)

    print("+++++++++++++++++++++++++++++++++++++++++++++++++++")
    print("当前的页码是:%s" % page)
    print("当前的大页码(s_n)是:%s" % s_n)
    print("当前的小页码是(r_n):%s" % r_n)
    print("查询的大范围(50条范围是):%s" % str(select_range))
    print("查询的小范围(10条范围是):%s" % str(return_range))
    print("反馈的页码是 :%s" % str(list(page_range)))
    print("+++++++++++++++++++++++++++++++++++++++++++++++++++")

然后将代码嵌入到我们的查询试图当中

def list_students(request):
    if request.method == "GET":
        page = request.GET.get("page")
        page_size = request.GET.get("page_size")
        onece_page = 5
        if not page:
            page = 1
        if not page_size:
            page_size = 5
        page = int(page)
        page_size =int(page_size)
        if page % onece_page == 0:
            s_n = int(page / onece_page)
            r_n = onece_page
        else:
            s_n = int(page / onece_page) + 1
            r_n = page % onece_page

        total = Student.objects.all()  # 查询所有的数据

        select_start = (s_n - 1) * onece_page*page_size
        select_end = s_n * onece_page*page_size
        select_range = total[select_start:select_end]
        return_start = (r_n - 1) * page_size
        return_end = r_n * page_size
        return_range = select_range[return_start:return_end]

        if page <= 3:
            page_range = range(1, 6)
        else:
            page_range = range(page - 2, page + 3)

    return render(request,"stu_list.html",{"data":return_range,"page_range":page_range})

猜你喜欢

转载自blog.csdn.net/weixin_44303465/article/details/89514617
今日推荐