分页组件

分页组件

 

 1 2.分页组件
 2     -Django内置分页
 3         -Paginator, Page
 4         -页面:调用时用include,避免重复代码
 5     -扩展Django的内置分页
 6         -class CustomPaginator(Paginator)
 7     
 8     传入:
 9         -所有数据
10         -当前页
11         -每页显示30条
12         -最多页面7个
13 
14     -自定义分页
15     传入:
16         -所有数据的个数
17         -当前页
18         -每页显示30条
19         -最多页面7个

粗劣的分页:

 1 from django.shortcuts import render,HttpResponse
 2 
 3 # Create your views here.
 4 from django.core.paginator import Paginator,EmptyPage,PageNotAnInteger
 5 
 6 USER_LIST = []
 7 for i in range(1,666):
 8     temp = {'name':'root'+str(i),'age':i}
 9     USER_LIST.append(temp)
10 
11 def index(request):
12     per_page_count = 10
13     current_page = request.GET.get('p')
14     current_page = int(current_page)
15 
16     start = (current_page-1) * per_page_count
17     end = current_page * per_page_count
18     data = USER_LIST[start:end]
19     prev_pager = current_page - 1
20     next_pager = current_page + 1
21     if len(USER_LIST) % per_page_count:
22         sum_pages = len(USER_LIST) // per_page_count + 1
23     else:
24         sum_pages = len(USER_LIST) // per_page_count
25     if current_page <= 1:
26         prev_pager = 1
27     if current_page == sum_pages:
28         next_pager = current_page
29     return render(request,"index.html",{'user_list':data,'prev_pager':prev_pager,'next_pager':next_pager})
views.py
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8     <ul>
 9         {% for row in user_list %}
10             <li>{{ row.name }}-{{ row.age }}</li>
11         {% endfor %}
12     </ul>
13     <a href="/index.html?p={{ prev_pager }}">上一页</a>
14     <a href="/index.html?p={{ next_pager }}">下一页</a>
15 </body>
16 </html>
index.html

Django内置分页组建及扩展

 1 from django.shortcuts import render,HttpResponse
 2 
 3 # Create your views here.
 4 from django.core.paginator import Paginator,EmptyPage,PageNotAnInteger
 5 
 6 USER_LIST = []
 7 for i in range(1,666):
 8     temp = {'name':'root'+str(i),'age':i}
 9     USER_LIST.append(temp)
10 
11 def index(request):
12     per_page_count = 10
13     current_page = request.GET.get('p')
14     current_page = int(current_page)
15 
16     start = (current_page-1) * per_page_count
17     end = current_page * per_page_count
18     data = USER_LIST[start:end]
19     prev_pager = current_page - 1
20     next_pager = current_page + 1
21     if len(USER_LIST) % per_page_count:
22         sum_pages = len(USER_LIST) // per_page_count + 1
23     else:
24         sum_pages = len(USER_LIST) // per_page_count
25     if current_page <= 1:
26         prev_pager = 1
27     if current_page == sum_pages:
28         next_pager = current_page
29     return render(request,"index.html",{'user_list':data,'prev_pager':prev_pager,'next_pager':next_pager})
30 
31 class CustomPaginator(Paginator):
32     def __init__(self,current_page,per_pager_num,*args,**kwargs):
33         self.current_page = int(current_page)
34         self.per_pager_num = int(per_pager_num)
35         super(CustomPaginator,self).__init__(*args,**kwargs)
36     def pager_num_range(self):
37         if self.num_pages < self.per_pager_num:
38             return range(1,self.num_pages+1)
39 
40         part = int(self.per_pager_num/2)
41         if self.current_page <= part:
42             return range(1,self.per_pager_num+1)
43         if (self.current_page+part) > self.num_pages:
44             return range(self.num_pages-self.per_pager_num+1,self.num_pages+1)
45         return range(self.current_page-part,self.current_page+part+1)
46 
47 def index1(request):
48     #Django内置的page分页
49     #from django.core.paginator import Paginator,EmptyPage,PageNotAnInteger
50     current_page = request.GET.get('p')
51     paginator = CustomPaginator(current_page,11,USER_LIST,10)
52     print(paginator.per_page)# per_page: 每页显示条目数量
53     print(paginator.count)# count:    数据总个数
54     print(paginator.num_pages)# num_pages:总页数
55     print(paginator.page_range)# page_range:总页数的索引范围,如: (1,10),(1,200)
56     # page:     page对象(是否具有下一页,是否具有上一页)
57     try:
58         posts = paginator.page(current_page)
59         print(posts.has_next())# has_next              是否有下一页
60         print(posts.next_page_number())# next_page_number      下一页页码
61         print(posts.has_previous())# has_previous          是否有上一页
62         print(posts.previous_page_number())# previous_page_number  上一页页码
63         # object_list           分页之后的数据列表
64         # number                当前页
65         # paginator             paginator对象
66     except PageNotAnInteger:
67         posts = paginator.page(1)
68     except EmptyPage:
69         posts = paginator.page(paginator.num_pages)
70     return render(request,"index1.html",{'posts':posts})
views.py
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8     <ul>
 9         {% for row in posts.object_list %}
10             <li>{{ row.name }}-{{ row.age }}</li>
11         {% endfor %}
12     </ul>
13     {% include 'include/pager.html' %}
14 </body>
15 </html>
index1.html
 1 {% if posts.has_previous %}
 2     <a href="/index1.html?p={{ posts.previous_page_number }}">上一页</a>
 3 {% endif %}
 4 
 5 {% for i in posts.paginator.pager_num_range %}
 6     {% if i == posts.number %}
 7         <a style="color: red;" href="/index1.html?p={{ i }}">{{ i }}</a>
 8     {% else %}
 9         <a href="/index1.html?p={{ i }}">{{ i }}</a>
10     {% endif %}
11 {% endfor %}
12 
13 {% if posts.has_next %}
14     <a href="/index1.html?p={{ posts.next_page_number }}">下一页</a>
15 {% endif %}
16 
17 <span>
18     {{ posts.number }}//{{ posts.paginator.num_pages }}
19 </span>
pager.html

自定义分页:

1 def index2(request):
2     from APP01.pager import Pagination
3     current_page = request.GET.get('p')
4     page_obj = Pagination(666,current_page)
5     data_list = USER_LIST[page_obj.start():page_obj.end()]
6 
7     return render(request,"index2.html",{'data':data_list,'page_obj':page_obj})
views.py
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <link rel="stylesheet" href="/static/bootstrap-4.1.3-dist/css/bootstrap.css">
 8 <body>
 9     <ul>
10         {% for row in data %}
11             <li>{{ row.name }}-{{ row.age }}</li>
12         {% endfor %}
13     </ul>
14     {% for i in page_obj.pager_num_range %}
15         <a href="/index2.html?p={{ i }}">{{ i }}</a>
16     {% endfor %}
17     <hr>
18     {{ page_obj.page_str|safe }}
19 
20     <ul class="pagination">
21         <li><a href="#" aria-label="Previous"><span aria-hidden="true">«</span></a></li>
22         <li><a href="#">1</a></li>
23         <li><a href="#">2</a></li>
24         <li><a href="#">3</a></li>
25         <li><a href="#">4</a></li>
26         <li><a href="#">5</a></li>
27         <li><a href="#" aria-label="Next"><span aria-hidden="true">»</span></a></li>
28       </ul>
29 </body>
30 </html>
index2.html
 1 class Pagination(object):
 2     def __init__(self,totalCount,currentPage,perPageItemNum=30,maxPageNum=7):
 3         #数据总数
 4         self.total_count = totalCount
 5         #当前页
 6         try:  #防止用户输入错误
 7             v = int(currentPage)
 8             if v <= 0: #判断若输入为负数时处理
 9                 v = 1
10             self.current_page = v
11         except Exception as e:
12             self.current_page = 1
13         #每页显示的行数
14         self.per_page_item_num = perPageItemNum
15         #最多显示页
16         self.max_page_num = maxPageNum
17 
18     def start(self):
19         return (self.current_page-1) * self.per_page_item_num
20 
21     def end(self):
22         return self.current_page * self.per_page_item_num
23     @property
24     def num_pages(self):
25         """
26         总页数
27         """
28         a,b = divmod(self.total_count,self.per_page_item_num)
29         if b == 0:
30             return a
31         return a+1
32 
33     def pager_num_range(self):
34         #return range(1,12)  直接定死页码数量和显示
35         if self.num_pages < self.max_page_num:
36             return range(1,self.num_pages+1)
37         part = int(self.max_page_num/2)
38         if self.current_page <= part:
39             return range(1,self.max_page_num+1)
40         if (self.current_page+part) > self.num_pages:
41             return range(self.num_pages-self.max_page_num+1,self.num_pages+1)
42         return range(self.current_page-part,self.current_page+part+1)
43 
44     def page_str(self):
45         page_list = []
46         #首页
47         first = "<a href='/index2.html?p=1'>首页</a>"
48         page_list.append(first)
49         #上一页
50         if self.current_page == 1:
51             prev = "<a href='#'>上一页</a>"
52         else:
53             prev = "<a href='/index2.html?p=%s'>上一页</a>" % (self.current_page-1)
54         page_list.append(prev)
55         #中间页码
56         for i in self.pager_num_range():
57             if i == self.current_page:
58                 temp = "<a style='color:red' href='/index2.html?p=%s'>%s</a>" % (i,i)
59             else:
60                 temp = "<a href='/index2.html?p=%s'>%s</a>" % (i,i)
61             page_list.append(temp)
62         #下一页
63         if self.current_page == self.num_pages:
64             next = "<a href='#'>下一页</a>"
65         else:
66             next = "<a href='/index2.html?p=%s'>下一页</a>" % (self.current_page+1)
67         page_list.append(next)
68         #末页
69         last = "<a href='/index2.html?p=%s'>末页</a>" % self.num_pages
70         page_list.append(last)
71 
72         return ''.join(page_list)
pager.py
posted @ 2023-12-06 17:33  木屐呀  阅读(8)  评论(0编辑  收藏  举报
//增加一段JS脚本,为目录生成使用