一. Django内置分页
1.django内置分页
from django.shortcuts import render from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger L = [] for i in range(999): L.append(i) def index(request): current_page = request.GET.get('p') #paginator对象 paginator = Paginator(L, 10) #paginator对象所含方法 # per_page: 每页显示条目数量 # count: 数据总个数 # num_pages:总页数 # page_range:总页数的索引范围,如: (1,10),(1,200) # page: page对象 try: #page对象 posts = paginator.page(current_page) #page对象所含方法 # has_next 是否有下一页 # next_page_number 下一页页码 # has_previous 是否有上一页 # previous_page_number 上一页页码 # object_list 分页之后的数据列表 # number 当前页 # paginator paginator对象 except PageNotAnInteger: posts = paginator.page(1) except EmptyPage: posts = paginator.page(paginator.num_pages) return render(request, 'index.html', {'posts': posts})
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <ul> {% for item in posts %} <li>{{ item }}</li> {% endfor %} </ul> <div class="pagination"> <span class="step-links"> {% if posts.has_previous %} <a href="?p={{ posts.previous_page_number }}">上一页</a> {% else %} <a href="?p=1">上一页</a> {% endif %} {% if posts.has_next %} <a href="?p={{ posts.next_page_number }}">下一页</a> {% else %} <a href="?P={{ posts.paginator.num_pages }}">下一页</a> {% endif %} <span class="current"> {{ posts.number }}/{{ posts.paginator.num_pages }} </span> </span> </div> </body>
2.扩展django内置分页
from django.shortcuts import render from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger class CustomPaginator(Paginator): def __init__(self, current_page, max_pager_num, *args, **kwargs): """ :param current_page: 当前页 :param max_pager_num:最多显示的页码个数 :param args: :param kwargs: :return: """ self.current_page = int(current_page) self.max_pager_num = max_pager_num super(CustomPaginator, self).__init__(*args, **kwargs) def page_num_range(self): # 当前页面 # self.current_page # 总页数 # self.num_pages # 最多显示的页码个数 # self.max_pager_num print(1) if self.num_pages < self.max_pager_num: return range(1, self.num_pages + 1) print(2) part = int(self.max_pager_num / 2) if self.current_page - part <= 1: return range(1, self.max_pager_num + 1) print(3) if self.current_page + part > self.num_pages: return range(self.num_pages + 1 - self.max_pager_num, self.num_pages + 1) print(4) return range(self.current_page - part, self.current_page + part + 1) L = [] for i in range(999): L.append(i) def index(request): current_page = request.GET.get('p') #paginator对象 paginator = CustomPaginator(current_page,7,L, 10) # per_page: 每页显示条目数量 # count: 数据总个数 # num_pages:总页数 # page_range:总页数的索引范围,如: (1,10),(1,200) # page: page对象 try: #page对象 posts = paginator.page(current_page) # has_next 是否有下一页 # next_page_number 下一页页码 # has_previous 是否有上一页 # previous_page_number 上一页页码 # object_list 分页之后的数据列表 # number 当前页 # paginator paginator对象 except PageNotAnInteger: posts = paginator.page(1) except EmptyPage: posts = paginator.page(paginator.num_pages) return render(request, 'index.html', {'posts': posts})
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <ul> {% for item in posts %} <li>{{ item }}</li> {% endfor %} </ul> <div class="pagination"> <span class="step-links"> {% if posts.has_previous %} <a href="?p={{ posts.previous_page_number }}">上一页</a> {% else %} <a href="?p=1">上一页</a> {% endif %} {% for i in posts.paginator.page_num_range %} <a href="?p={{ i }}">{{ i }}</a> {% endfor %} {% if posts.has_next %} <a href="?p={{ posts.next_page_number }}">下一页</a> {% else %} <a href="?P={{ posts.paginator.num_pages }}">下一页</a> {% endif %} <span class="current"> {{ posts.number }}/{{ posts.paginator.num_pages }} </span> </span> </div> </body>
二. 自定制分页
1.自定制分页设计步骤
<1>设定每页显示数据条数
<2>用户输入页码(第一页、第二页...)
<3>设定显示多少页号
<4>获取当前数据总条数
<5>根据设定显示多少页号和数据总条数计算出,总页数
<6>根据设定的每页显示条数和当前页码,计算出需要取数据表的起始位置
<7>在数据表中根据起始位置取值,页面上输出数据
<8>输出分页html,如:[上一页][1][2][3][4][5][下一页]
2.自定制分页设计
class Pagination(object): def __init__(self,TotalItemCount,CurrentPage,PerPageItemNum=10,MaxPageNum=7): """ input parameter TotalItemCount:数据总个数 current_page: 当前页 PerPageItemNum:每页显示数据个数 MaxPageNum:最多显示的页码个数 :return: """ self.total_item_count = TotalItemCount try: CurrentPage = int(CurrentPage) if CurrentPage <= 0: CurrentPage = 1 self.current_page = CurrentPage except Exception as e: self.current_page = 1 self.per_page_item_num = int(PerPageItemNum) self.max_page_num =int(MaxPageNum) @property def start(self): """当前页开始数据索引""" return (self.current_page-1) * self.per_page_item_num @property def end(self): """当前页结束数据索引""" return self.current_page * self.per_page_item_num @property def num_pages(self): """计算总页数""" a,b = divmod(self.total_item_count,self.per_page_item_num) if b == 0: return a return a+1 def page_num_range(self): """计算每页显示的页码""" if self.num_pages < self.max_page_num: return range(1,self.num_pages+1) part = int(self.max_page_num/2) if self.current_page <= part: return range(1,self.max_page_num+1) if (self.current_page + part) > self.num_pages: return range(self.num_pages-self.max_page_num+1,self.num_pages+1) return range(self.current_page-part,self.current_page+part+1) def page_html(self): """输出分页html""" page_list = [] home_page = "<li><a href='/index.html?p=1'>首页</a></li>" page_list.append(home_page) if self.current_page == 1: previous_page = "<li><a href='#'>上一页</a></li>" else: previous_page = "<li><a href='/index.html?p=%s'>上一页</a></li>" %(self.current_page-1,) page_list.append( previous_page) for i in self.page_num_range(): if i == self.current_page: temp = "<li class='active'><a href='/index.html?p=%s'>%s</a></li>" %(i,i) else: temp = "<li><a href='/index2.html?p=%s'>%s</a></li>" % (i, i) page_list.append(temp) if self.current_page == self.num_pages: next_page = "<li><a href='#'>下一页</a></li>" else: next_page = "<li><a href='/index.html?p=%s'>下一页</a></li>" % (self.current_page + 1,) page_list.append(next_page) last_page = "<li><a href='/index.html?p=%s'>尾页</a></li>" %(self.num_pages,) page_list.append(last_page) return ''.join(page_list)
from django.shortcuts import render from student_manage.views.pagination import * USER_LIST = [] for i in range(1,666): temp = {'name':'root'+str(i), 'age':i} USER_LIST.append(temp) def index(request): current_page = request.GET.get('p') TotalItemCount=len(USER_LIST) print(TotalItemCount) paginator=Pagination(TotalItemCount,current_page,'10','11') data_list=USER_LIST[paginator.start:paginator.end] return render(request, 'index.html', {'data_list': data_list,'paginator':paginator})
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="/static/plugin/bootstrap/css/bootstrap.css" /> </head> <body> <ul> {% for item in data_list %} <li>{{item}}</li> {% endfor %} </ul> <ul class="pagination pagination-sm"> {{ paginator.page_html|safe }} </ul> </body> </html>
>>>>>>待续