麦子学院 2018-04-10 17:42
Django中的分页组件如何使用?
回复:0 查看:2570
1.
设计思路
根据每页显示数据量对数据进行切片显示。根据/index.html?p=4
用
GET
方法获取页码
1 def index(request):
2 per_page_count=10
3 current_page=request.GET.get('p')
4 current_page=int(current_page)
5 start=(current_page-1)*per_page_count
6 end=current_page*per_page_count
7 data=USER_LIST[start:end]
8
9 if current_page<=1:
10 prev_page=1
11 next_page = current_page + 1
12 else:
13 prev_page=current_page-1
14 next_page=current_page+1
15 return render(request,"index.html",{'user_list':data,'prev_page':prev_page,'next_page':next_page})
1 <body>
2 <ul>
3 {% for row in user_list %}
4 <li>{{ row.name }}-{{ row.age }}</li>
5 {% endfor %}
6 </ul>
7 <a href="/index.html?p={{ prev_page }}">
上一页
</a>
8 <a href="/index.html?p={{ next_page }}">
下一页
</a>
9 </body>
2.Django
原生分页组件
Django
封装的两个对象
Paginator
和
page
对象,通过输入的参数对数据进行处理得到各种属性,且两个对象互相包含。
Paginator
对象 参数有全部数据的数组,以及每页显示条目数量
,
函数内部封装了对象的各项属性
#
全部数据:
USER_LIST
,
=
》得出共有多少条数据
# per_page:
每页显示条目数量
# count:
数据总个数
# num_pages:
总页数
# page_range:
总页数的索引范围,如
: (1,10),(1,200)
# page: page
对象(是否具有下一页;是否有上一页;)
Page
对象 参数为当前的页码
# has_next
是否有下一页
# next_page_number
下一页页码
# has_previous
是否有上一页
# previous_page_number
上一页页码
# object_list
分页之后的数据列表,已经切片好的数据
# number
当前页
# paginator paginator
对象
from django.core.paginator import Paginator,EmptyPage,PageNotAnInteger
1 def index1(request):
2 current_page=request.GET.get('p')
3 paginator=Paginator(USER_LIST, 10)
4 try:
5 posts=paginator.page(current_page)
6 except PageNotAnInteger:
7 posts=paginator.page(1)
8 except EmptyPage:
9 posts=paginator.page(paginator.num_pages)
10 return render(request,"index1.html",{"posts":posts})
1 <ul>
2 {% for row in posts.object_list %}
3 <li>{{ row.name }}-{{ row.age }}</li>
4 {% endfor %}
5 </ul>
6 {% if posts.has_previous %}
7 <a href="/index1.html?p={{ posts.previous_page_number }}">
上一页
</a>
8 {% else %}
9 <a href="#">
上一页
</a>
10 {% endif %}
11 {% for i in posts.paginator.pager_num_range %}
12 {% if i == posts.number %}
13 <a style="font-size: 30px;" href="/index1.html?p={{ i }}">{{ i }}</a>
14 {% else %}
15 <a href="/index1.html?p={{ i }}">{{ i }}</a>
16 {% endif %}
17 {% endfor %}
18 {% if posts.has_next %}
19 <a href="/index1.html?p={{ posts.next_page_number }}">
下一页
</a>
20 {% endif %}
21 <span>
22 {{ posts.number }}/{{ posts.paginator.num_pages }}
23 </span>
可做出类似
上一页
下一页 1/100
的分页效果
3.
自定义分页组件
通过继承原生分页组件自定制分页功能
1 class CustomPaginator(Paginator):
2 def __init__(self,current_page, per_pager_num,*args,**kwargs):
3 #
当前页
4 self.current_page = int(current_page)
5 #
最多显示的页码数量
11
6 self.per_pager_num = int(per_pager_num)
7 super(CustomPaginator,self).__init__(*args,**kwargs)
8 def pager_num_range(self):
9 #
当前页
10 #self.current_page
11 #
最多显示的页码数量
11
12 #self.per_pager_num
13 #
总页数
14 # self.num_pages
15 if self.num_pages < self.per_pager_num:
16 return range(1,self.num_pages+1)
17 #
总页数特别多
5
18 part = int(self.per_pager_num/2)
19 if self.current_page <= part:
20 return range(1,self.per_pager_num+1)
21 if (self.current_page + part) > self.num_pages:
22 return range(self.num_pages-self.per_pager_num+1,self.num_pages+1)
23 return range(self.current_page-part,self.current_page+part+1)
效果如下:
上一页 1 2 3 4 5 6 7 8 9 10 11
下一页
6/100
4.bootstrap
自定制样式
1 {#bootstrap
自定制样式
#}
2 <nav aria-label="Page navigation">
3 <ul class="pagination">
4 <li>
5 {% if posts.has_previous %}
6 <a href="/index1.html?p={{ posts.previous_page_number }}" aria-label="Previous">
7 <span aria-hidden="true">«</span>
8 </a>
9 {% else %}
10 <a href="#" aria-label="Previous">
11 <span aria-hidden="true">«</span>
12 </a>
13 {% endif %}
14 </li>
15 {% for i in posts.paginator.pager_num_range %}
16 {% if i == posts.number %}
17 <li class="active"><a href="/index1.html?p={{ i }}">{{ i }}</a></li>
18 {% else %}
19 <li><a href="/index1.html?p={{ i }}">{{ i }}</a></li>
20 {% endif %}
21 {% endfor %}
22 <li>
23 <a href="/index1.html?p={{ posts.next_page_number }}" aria-label="Next">
24 <span aria-hidden="true">»</span>
25 </a>
26 </li>
27 </ul>
28 </nav>