一、views.py操作(后台数据获取)
1 from django.shortcuts import render
2 from django.core.paginator import Paginator,PageNotAnInteger,EmptyPage,Page
3
4 USER_LIST = []
5 for i in range(1,666):
6 tem = {'name':'root'+str(i), 'age':i}
7 USER_LIST.append(tem)
8
9 def index(request):
10 current_page = request.GET.get('p')
11 current_page = int(current_page)
12 per_page_count = 10
13 '''
14 p=1
15 索引:0-10 取值:0-9
16 p=2
17 索引:10-20 取值:10-19
18 '''
19 start = (current_page-1)*per_page_count
20 end = current_page*per_page_count
21 data = USER_LIST[start:end]
22
23 prev_page = current_page-1
24 next_page = current_page+1
25 return render(request, 'pager.html',{'user_list':data, 'prev_page':prev_page, 'next_page':next_page})
26
27 # Django内置分页拓展
28 class CustomPaginator(Paginator): # 修改类
29 def __init__(self,current_page, per_page_num,*args,**kwargs):
30 # 当前页
31 self.current_page = int(current_page)
32 # 最多显示页码数 11
33 self.per_page_num = int(per_page_num)
34 super(CustomPaginator, self).__init__(*args,**kwargs)
35
36 def pager_num_range(self):
37 # 当前页
38 # self.current_page
39 # 最多显示页码数 11
40 # self.per_page_num
41 # 总页数
42 # self.num_pages
43 # 判断最小极值
44 if self.per_page_num > self.num_pages:
45 # 根据当前页动态生成,设置页面显示数
46 return range(1, self.num_pages + 1)
47 # 总页数特别多时
48 part = int(self.per_page_num/2)
49
50 if part >= self.current_page:
51 return range(1, self.per_page_num + 1)
52 # 判断最大极值
53 if (self.current_page + part) >= self.num_pages:
54 return range(self.num_pages - self.per_page_num + 1, self.num_pages + 1)
55 return range(self.current_page - part, self.current_page + part +1)
56
57 def index1(request):
58
59 current_page = request.GET.get('p')
60 # per_page: 每页显示条目数量
61 # count:数据总个数
62 # num_pages: 总页数
63 # page_range: 总页数的索引范围,页码范围,如:(1,10),(1,200)
64 # page:page对象(是否具有上一页,是否有下一页)
65 paginator = CustomPaginator(current_page,7,USER_LIST,10) # USER_LIST为总数据 10为每页条数
66 try:
67 posts = paginator.page(current_page)
68 # has_next 是否有下一页
69 # next_page_number 下一页页码
70 # has_previous 是否有上一页
71 # previous_page_number 上一页页码
72 # object_list 分页之后的数据列表
73 # number 当前页
74 # paginator paginator对象
75 except PageNotAnInteger:
76 posts = paginator.page(1)
77 except EmptyPage:
78 posts = paginator.page(paginator.num_pages)
79
80 return render(request,'index1.html',{'posts':posts})
二、HTML操作(前端代码)
拓 展
1 <ul>
2 {% for row in posts.object_list %}
3 <li>{{row.name}}-{{row.age}}</li>
4 {% endfor %}
5 </ul>
6
7 {# 使用include调用pager #}
8 {% include 'include/pager.html' %}
pager.html
1 {% if posts.has_previous %}
2 <a href="/index1.html?p={{posts.previous_page_number}}">上一页</a>
3 {% else %}
4 <a href="#">上一页</a>
5 {% endif %}
6 <a href="/index1.html?p={{1}}">首页</a>
7 {% for i in posts.paginator.pager_num_range %}
8 {% if i == posts.number %}
9 <a href="/index1.html?p={{i}}" style="font-size: 30px;">{{i}}</a>
10 {% else %}
11 <a href="/index1.html?p={{i}}" >{{i}}</a>
12 {% endif %}
13 {% endfor %}
14 <a href="/index1.html?p={{posts.paginator.num_pages}}">尾页</a>
15 {% if posts.has_next %}
16 <a href="/index1.html?p={{posts.next_page_number}}">上一页</a>
17 {% else %}
18 <a href="#">下一页</a>
19 {% endif %}
20 <span>
21 {{posts.number}}/{{posts.paginator.num_pages}}
22 </span>
三、学习内容归纳
1 分页组件
2 - Django内置分页
3 - paginator、page
4 - 页面:include
5
6 - 扩展Django内置分页
7 - class CustomPaginator(Paginator):
8 传入:
9 - 所有数据
10 - 每页行数
11 - 当前页
12 - 最多页面数
13
14
15 - 自定义分页
16 传入:
17 - 所有数据的个数
18 - 每页行数
19 - 当前页
20 - 最多页面数