django 分页
已经封装成包,使用时导入即可
实现:
class MyPage: def __init__(self, url, info_count, page_num, info_num=10, max_page=11, ): """ :param url: 请求的url :param info_count: 总共有多少条数据 :param page_num: 访问的页码 :param info_num: 展示多少条数据 :param max_page: 展示多少条页码 """ self.url = url self.info_count = info_count try: page_num = int(page_num) except Exception as e: page_num = 1 self.info_num = info_num self.page_num = page_num self.max_page = max_page page_count, m = divmod(self.info_count, self.info_num) if m: page_count += 1 self.page_count = page_count else: self.page_count = page_count start_info = (self.page_num - 1) * self.info_num end_info = start_info + self.info_num self.start_info = start_info self.end_info = end_info half_max_page = self.max_page // 2 start_page = self.page_num - half_max_page # 开始页码 end_page = self.page_num + half_max_page # 结束页码 # 如果可以显示的页码总数少于设置的展示页码数,展示的页码数默认为可以显示的页码总数 if self.page_count < self.max_page: self.start_page = 1 self.max_page = self.page_count # 如果开始页码小于1,则开始页码为1 , 结束页码为最可以显示的页码数 if start_page < 1: start_page = 1 end_page = self.max_page # 如果结束页码大于页码总数,则结束页码为页码总数,开始页码则为页码总数减去规定的可以显示的页码数+1 if end_page > page_count: end_page = page_count start_page = end_page - self.max_page + 1 self.start_page = start_page self.end_page = end_page @property def start(self): return self.start_info @property def end(self): return self.end_info def page_html(self): info_list = [] # 添加一个首页标签 first_page = ‘<li><a href="{}?next=1">首页</a></li>‘.format(self.url) info_list.append(first_page) # 添加一个上一页标签,如果是第一页,标签不能点击 if self.page_num <= 1: next_page = ‘<li class="disabled"><a href="{}?next={}" aria-abel="Previous"><spanaria-hidden="true">«</span></a></li>‘.format(self.url, self.page_num) info_list.append(next_page) else: next_page = ‘<li><a href="{}?next={}" aria-abel="Previous"><spanaria-hidden="true">«</span></a></li>‘.format(self.url, self.page_num - 1) info_list.append(next_page) for i in range(self.start_page, self.end_page + 1): li = ‘<li><a href="{}?next={}">{}</a></li>‘.format(self.url, i, i) info_list.append(li) # 添加一个下一页标签,如果是最后一页,标签不能点击 if self.page_num == self.page_count: next_page = ‘<li class="disabled"><a href="{}?next={}"><span aria-hidden="true">»</span></a></li>‘.format(self.url, self.page_num) info_list.append(next_page) else: next_page = ‘<li><a href="{}?next={}"><span aria-hidden="true">»</span></a></li>‘.format(self.url, self.page_num + 1) info_list.append(next_page) # 添加一个尾页标签 trailer_page = ‘<li><a href="{}?next={}">尾页</a></li>‘.format(self.url, self.page_count) info_list.append(trailer_page) str_info_list = ‘‘.join(info_list) # 将存有页数的HTML标签列表转换成字符串形式 return str_info_list
分页
用法:
# 导入源码包 def show_book(request): # all_book = models.Book.objects.all() # return render(request, ‘show/show_book.html‘, {‘all_book‘: all_book}) # 总共有多少条数据 info_count = models.Book.objects.all().count() # 获取页码,默认为1 page_num = request.GET.get(‘next‘, 1) # 获取客户端url地址,不包括域名 url = request.path_info # 创建分页对象 obj_page = paging.MyPage(url=url, info_count=info_count, page_num=page_num, info_num=8, max_page=7) # 展示哪些条数据 info = models.Book.objects.all() all_book = info[obj_page.start:obj_page.end] # 获取分页HTML代码 str_info_list = obj_page.page_html() return render(request, ‘show/show_book.html‘, {‘all_book‘: all_book, ‘str_info_list‘: str_info_list})
views