Django高级分页思路

1.原理:

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

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

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

首先编写实例代码

page_size=10

当我们查询第一到五页的时候,不对其他数据进行查询,只查询前50条数据

也就是5页,每页显示10条数据

2.效果

当我们查询第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

扫描二维码关注公众号,回复: 6032917 查看本文章

#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

page=n select_range:(s_n-1)*50-s_n*50 return_range:40-50

# //整除 %取余

3.代码实现

total = range(1000)
while True:
    page = int(input(">>>"))
    s_n = page / 5
    if page % 5 == 0:
        s_n = int(page / 5)
        r_n = 5
    else:
        s_n = int(page / 5) + 1
        r_n = page % 5
    print(s_n)
    print("%s-%s"%((s_n-1)*50,s_n*50))
    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=[1,2,3,4,5]
    else:
        page_range=range(page-2,page+3)
 
    print("+++++++++++++++++++++++++++++++++++++++++")
    print("当前的页码是:%s"%page)
    print("查询的大页码是:%s"%s_n)
    print("查询的小页码是:%s"%r_n)
    print("查询的大范围(50条范围是):%s"%str(select_range))
    print("查询的大范围(50条范围是):%s"%str(list(select_range)))
    print("查询的小范围(10条范围是):%s"%str(return_range))
    print("查询的小范围(10条范围是):%s"%str(list(return_range)))
    print("反馈的页面是:%s"%str(list(page_range)))

执行结果:

将上片文章中的代码进行加工,实现页面只显示五个页码,并且当前页码发生改变前后五个页码也发生改变,并且当前页面数据也随之发生改变.

首先编写视图文件:

def list_student(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)
        page_size = int(page_size)
        start = (page-1)*page_size
        end = page*page_size
    students = Students.objects.order_by('id')
    length = len(students)
    page_num = length/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,'student_list.html',{'data':data,'page_range':page_range})

配置对应路由:

from Student.views import *
urlpatterns +=[
    path('reg_stu/', register_student),
    path('reg_stu_a/',register_student_ajax),
    path('reg_stu_d/',areg_student_data),
    path('stu_list/',list_student),
    path('reg_stu_text/',register_student_text),
    path('list_student/',list_students),
    path('studentList',studentList)
]

效果展示:

第一页:

第五页:

猜你喜欢

转载自blog.csdn.net/weixin_44239541/article/details/89110660