django高级应用(分页功能)
1、原生分页应用
前端html代码
1 2 3 4 5Title 6 7 8
- 9 {% for item in posts.object_list %}10
- { { item.name }}- { { item.age }} 11 {% endfor %}12
django后台代码
1 from django.shortcuts import render 2 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger 3 4 USER_LIST = [] 5 for i in range(1, 999): 6 temp = { 'name': 'root' + str(i), 'age': i} 7 USER_LIST.append(temp) 8 9 def index1(request):10 # 全部数据:USER_LIST,=》得出共有多少条数据11 # per_page: 每页显示条目数量12 # count: 数据总个数13 # num_pages:总页数14 # page_range:总页数的索引范围,如: (1,10),(1,200)15 # page: page对象(是否具有下一页;是否有上一页;)16 current_page = request.GET.get('p')17 # Paginator对象18 paginator = Paginator(USER_LIST, 10)19 #paginator = CustemPaginator(current_page, 11, USER_LIST, 10)20 try:21 posts = paginator.page(current_page)22 # has_next 是否有下一页23 # next_page_number 下一页页码24 # has_previous 是否有上一页25 # previous_page_number 上一页页码26 # object_list 分页之后的数据列表,已经切片好的数据27 # number 当前页28 # paginator paginator对象29 except PageNotAnInteger:30 posts = paginator.page(1)31 except EmptyPage:32 posts = paginator.page(paginator.num_pages)33 return render(request, "index1.html", { "posts": posts})34 35 django后台代码
缺点:功能少,例如显示页面范围等。
2、自定制添加显示页面范围的功能
1 {% if posts.has_previous %} 2 上一页 3 {% else %} 4 上一页 5 {% endif %} 6 7 {% for i in posts.paginator.page_num_range %} 8 {% if i == posts.number %} 9 { { i }}10 {% else %}11 { { i }}12 {% endif %}13 {% endfor %}14 15 {% if posts.has_next %}16 下一页17 {% endif %}18 19 { { posts.number }}/{ { posts.paginator.num_pages }}20
django后台代码
1 from django.shortcuts import render 2 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger 3 4 USER_LIST = [] 5 for i in range(1, 999): 6 temp = { 'name': 'root' + str(i), 'age': i} 7 USER_LIST.append(temp) 8 9 class CustemPaginator(Paginator):10 """11 是自定制django分页类的方法12 :page_num_range 显示返回页数范围13 :current_page 当前页数14 :max_page_num 最大显示的页码数15 """16 def __init__(self, current_page, max_pager_num, *args, **kwargs):17 # 当前页18 self.current_page = int(current_page)19 # 最多显示的页码数量20 self.max_pager_num = int(max_pager_num)21 super(CustemPaginator,self).__init__(*args, **kwargs)22 23 def page_num_range(self):24 # 当前页25 # self.current_page26 # 最多显示的页码数量 1127 # self.per_pager_num28 # 总页数29 # self.num_pages30 31 # 判断如果页面总数量小于显示页面的总数量,那么返回最大的页面总数量。32 if self.num_pages < self.max_pager_num:33 return range(1, self.num_pages + 1)34 part = int(self.max_pager_num / 2)35 36 # 判断当前页小于等于最大显示页的一半,那么返回1到最大显示页数量。37 if self.current_page <= part:38 return range(1, self.max_pager_num + 1)39 40 # 当选择页数加上显示页数的一半的时候,说明越界了,例如最大也数是15,显示页数是10,我选择11页,那么11+5等于16,大于15,那么就显示总页数15-11+1,15+141 if (self.current_page + part) > self.num_pages:42 # 那么返回总页数前去当前显示页数个数+1的值,和总页数+1的值。43 return range(self.num_pages - self.max_pager_num + 1, self.num_pages + 1)44 45 # 当选择页大于当前总页数的一半的时候,返回当前选择页的前五个和后五个页数。46 return range(self.current_page - part, self.current_page + part + 1)47 48 49 def index1(request):50 # 全部数据:USER_LIST,=》得出共有多少条数据51 # per_page: 每页显示条目数量52 # count: 数据总个数53 # num_pages:总页数54 # page_range:总页数的索引范围,如: (1,10),(1,200)55 # page: page对象(是否具有下一页;是否有上一页;)56 current_page = request.GET.get('p')57 # Paginator对象58 # paginator = Paginator(USER_LIST, 10)59 paginator = CustemPaginator(current_page, 11, USER_LIST, 10)60 try:61 posts = paginator.page(current_page)62 # has_next 是否有下一页63 # next_page_number 下一页页码64 # has_previous 是否有上一页65 # previous_page_number 上一页页码66 # object_list 分页之后的数据列表,已经切片好的数据67 # number 当前页68 # paginator paginator对象69 except PageNotAnInteger:70 posts = paginator.page(1)71 except EmptyPage:72 posts = paginator.page(paginator.num_pages)73 return render(request, "index1.html", { "posts": posts})
3、自定制分页模块
1 # -*- coding: utf-8 -*- 2 # @Time : 2017/7/4 3 # @Author : Ocean.Pan 4 5 class Pagination(object): 6 def __init__(self,current_page,total_page_count,per_page_item_num=10,max_page_num=7,page_url=None): 7 # 当前页 8 self.current_page = current_page 9 try: 10 v = int(current_page) 11 if v <= 0: 12 v = 1 13 self.current_page = v 14 except Exception as e: 15 self.current_page = 1 16 # 数据总个数 17 self.total_page_count = total_page_count 18 # 每一页显示的页面元素个数 19 self.per_page_item_num = per_page_item_num 20 # 最大显示页码 21 self.max_page_num = max_page_num 22 self.page_url = page_url 23 24 def start_page_item(self): 25 ''' 26 开始显示的页面元素,即从第几个页面链接开始显示 27 :return: 当前页减一乘以每个页面最多显示元素个数 28 ''' 29 return (self.current_page-1) * self.per_page_item_num 30 31 def end_page_item(self): 32 ''' 33 结束显示的页面元素,即最后一个页面元素的显示 34 :return: 当前页乘以每个页面显示的最大元素个数 35 ''' 36 return self.current_page * self.per_page_item_num 37 38 # @property 是让num_pages变成以静态属性方式访问。 39 @property 40 def num_pages(self): 41 ''' 42 总页码数量 43 :return: 当b为零的时候代表是可整除的,a就是返回值,当不能整除时a+1返回。 44 ''' 45 a,b = divmod(self.total_page_count,self.per_page_item_num) 46 if b == 0: 47 return a 48 return a+1 49 50 def page_num_range(self): 51 ''' 52 页码的显示范围 53 :return: 54 ''' 55 56 # 判断如果页面总数量小于显示页面的总数量,那么返回最大的页面总数量。 57 if self.num_pages < self.max_page_num: 58 return range(1, self.max_page_num + 1) 59 part = int(self.max_page_num / 2) 60 61 # 判断当前页小于等于最大显示页的一半,那么返回1到最大显示页数量。 62 if self.current_page <= part: 63 return range(1, self.max_page_num + 1) 64 65 # 当选择页数加上显示页数的一半的时候,说明越界了,例如最大也数是15,显示页数是10,我选择11页,那么11+5等于16,大于15,那么就显示总页数15-11+1,15+1 66 if (self.current_page + part) > self.num_pages: 67 # 那么返回总页数前去当前显示页数个数+1的值,和总页数+1的值。 68 return range(self.num_pages - self.max_page_num + 1, self.num_pages + 1) 69 70 # 当选择页大于当前总页数的一半的时候,返回当前选择页的前五个和后五个页数。 71 return range(self.current_page - part, self.current_page + part + 1) 72 73 def page_str(self): 74 page_list=[] 75 first = "
1 from app01.paging import Pagination 2 3 USER_LIST = [] 4 for i in range(1, 999): 5 temp = { 'name': 'root' + str(i), 'age': i} 6 USER_LIST.append(temp) 7 8 def index2(request): 9 current_page = request.GET.get('p')10 page_obj = Pagination(current_page,999,page_url="index2.html")11 data_list = USER_LIST[page_obj.start_page_item():page_obj.end_page_item()]12 return render(request,"index2.html",{ "data":data_list,"page_obj":page_obj})
Title
- { % for item in data %}
- { { item.name }}- { { item.age }} { % endfor %}
- { { page_obj.page_str|safe }}