django-自定义分页
2018-01-27 12:06
411 查看
向模板传参数方式
拼接字符串形式
封装对象方法
准备数据如下:
views.py
views.py
我们来看下对象封装类
myPage.py
拼接字符串形式
封装对象方法
准备数据如下:
data = [] for i in range(1, 312): tmp = {"id": i, "name": "safly{}".format(i)} data.append(tmp)
向模板传参数方式
page.html<body> <div class="container-fluid row"> <div class="col-md-5"> <table class="table-bordered table"> <thead> <tr> <th>id</th> <th>姓名</th> </tr> </thead> <tbody> {% for user in user_list %} <tr> <td>{{ user.id }}</td> <td>{{ user.name }}</td> </tr> {% endfor %} </tbody> </table> </div> </div> <div class="row"> <div class="col-md-5"> <div class="pull-right container-fluid"> <nav aria-label="Page navigation"> <ul class="pagination"> <li> <a href="/page/?page={{ pre }}" aria-label="Previous"> <span aria-hidden="true">«</span> </a> </li> <li><a href="/page/?page=1">首页</a></li> {% for page in total_page_list_render %} <li><a href="/page/?page={{ page }}">{{ page }}</a></li> {% endfor %} <li><a href="/page/?page={{ total_page_count }}">尾页</a></li> <li> <a href="/page/?page={{ next }}" aria-label="Next"> <span aria-hidden="true">»</span> </a> </li> </ul> </nav> </div> </div> </div> </body>
views.py
def page(request): per_page_count = 10; try: currPage = int(request.GET.get("page")) except Exception as e: currPage = 1 page_count_show = 11; divmod1, divmod2 = divmod(len(data), per_page_count) if divmod2: total_page_count = divmod1 + 1 else: total_page_count = divmod1 page_count_show_half = page_count_show // 2 startPage = currPage - page_count_show_half endPage = currPage + page_count_show_half if currPage <= page_count_show_half: startPage = 1 endPage = page_count_show elif currPage > total_page_count - page_count_show_half: startPage = total_page_count - page_count_show + 1 endPage = total_page_count total_page_list_render = [i for i in range(startPage, endPage + 1)] user_list = data[(currPage - 1) * 10:currPage * 10] prv = currPage - 1 next = currPage + 1 print("current,prv,next", currPage, prv, next) if prv == 0: prv = 1 print("prv---", prv) if next == total_page_count + 1: next = total_page_count print("next---", prv) return render(request, "page.html", {"user_list": user_list, "total_page_list_render": total_page_list_render, "total_page_count": total_page_count, "pre": prv, "next": next, })
拼接字符串形式
page1.html<body> <div class="container-fluid row"> <div class="col-md-5"> <table class="table-bordered table"> <thead> <tr> <th>id</th> <th>姓名</th> </tr> </thead> <tbody> {% for user in user_list %} <tr> <td>{{ user.id }}</td> <td>{{ user.name }}</td> </tr> {% endfor %} </tbody> </table> </div> </div> <div class="row"> <div class="col-md-5"> <div class="pull-right container-fluid"> <nav aria-label="Page navigation"> <ul class="pagination" {{ pageHtml |safe }} </ul> </nav> </div> </div> </div> </body>
views.py
def page(request): try: curpage = int(request.GET.get("page")) except Exception as e: curpage = 1 ''' 页码 1 1 10 2 11 20 3 21 30 4 31 40 5 41 50 n 10*n-9 10*n 索引 10*n-10 10*n ''' # 每页展示数量 per_page = 10 # 总页数 divmod1, divmod2 = divmod(len(data), per_page) if divmod2: total_page = divmod1 + 1 else: total_page = divmod1 # 大于总页码,输出最后一页 if curpage > total_page: curpage = total_page # 当输出负数页码,输出第一页 if curpage <= 0: curpage = 1 fetch_data = data[10 * (curpage - 1):10 * curpage] # 选项卡的起始页 show_page = 11; middle_show_page = int(show_page // 2) start_page_index = curpage - middle_show_page end_page_index = curpage + middle_show_page if curpage <= middle_show_page: start_page_index = 1 end_page_index = show_page if curpage > total_page - middle_show_page: start_page_index = total_page - show_page + 1 end_page_index = total_page print(start_page_index, end_page_index) pageHtml = "" pageHtml += '<li><a href="/page/?page={0}" aria-label="Previous">' \ '<span aria-hidden="true">«</span></a></li>'.format(curpage - 1) # 首页 pageHtml += '<li> <a href = "/page/?page={0}">首页</a> </li>'.format(1) for i in range(start_page_index, end_page_index + 1): perHtml = '<li> <a href = "/page/?page={0}">{0}</a> </li>'.format(i) pageHtml += perHtml # 尾页 pageHtml += '<li> <a href = "/page/?page={0}">尾页</a> </li>'.format(total_page) pageHtml += '<li><a href="/page/?page={0}" aria-label="Next">' \ '<span aria-hidden="true">»</span></a></li>'.format(curpage + 1) print(curpage - 1, curpage + 1, "~~~~~~~~~~~") return render(request, "page1.html", {"user_list": fetch_data, "pageHtml": pageHtml})
封装对象方法
依然使用上例中的page1.html页面def page(request): page_num = request.GET.get("page") path = request.path_info # request.get_full_path() # 带参数的URL page = myPage.MyPage(page_num, len(data), path) page_html = page.page_html() return render(request, "page1.html", {"user_list": data[page.start:page.end], "pageHtml": page_html})
我们来看下对象封装类
myPage.py
""" 这个文件的使用指南 """ class MyPage(object): def __init__(self, page_num, total_count, base_url, per_page_num=10, max_show=11): """ :param page_num: 当前页 :param total_count: 数据总个数 :param base_url: 分页页码跳转的URL :param per_page_num: 每一页显示多少条数据 :param max_show: 页面上最多显示多少页码 """ # 实例化时传进来的参数 try: self.page_num = int(page_num) # 字符串类型,所以要转成int except Exception as e: self.page_num = 1 self.total_count = total_count self.base_url = base_url self.per_page_num = per_page_num self.max_show = max_show # 根据传进来的参数,计算的几个值 self.half_show = int((self.max_show - 1) / 2) # 总共有多少页 self.total_page_num, more = divmod(self.total_count, self.per_page_num) if more: self.total_page_num += 1 @property def start(self): return (self.page_num - 1) * self.per_page_num @property def end(self): return self.page_num * self.per_page_num def page_html(self): """ 返回页面上可以用的一段HTML 一段可用的分页页码的HTML :return: """ # 页面上页码从哪儿开始 page_start = self.page_num - self.half_show # 页面上页码最多展示到哪一个 page_end = self.page_num + self.half_show # 如果当前页小于等于half_show, 默认从第一页展示到max_show if self.page_num <= self.half_show: page_start = 1 page_end = self.max_show # 如果当前页大于等于总页数-half_show if self.page_num >= self.total_page_num - self.half_show: page_end = self.total_page_num page_start = self.total_page_num - self.max_show # 生成前页码的HTML page_html_list = [] # 放置一个首页按钮 page_first_tmp = '<li><a href="{}?page=1">首页</a></li>'.format(self.base_url) page_html_list.append(page_first_tmp) # 加上一页按钮 if self.page_num - 1 <= 0: # 表示没有上一页 page_prev_tmp = '<li class="disabled" ><a href="#">上一页</a></li>' else: page_prev_tmp = '<li><a href="{0}?page={1}">上一页</a></li>'.format(self.base_url, self.page_num - 1) page_html_list.append(page_prev_tmp) for i in range(page_start, page_end + 1): # 如果是当前页,就加一个active的样式 if i == self.page_num: tmp = '<li class="active"><a href="{0}?page={1}">{1}</a></li>'.format(self.base_url, i) else: tmp = '<li><a href="{0}?page={1}">{1}</a></li>'.format(self.base_url, i) page_html_list.append(tmp) # 加下一页按钮 if self.page_num + 1 > self.total_page_num: page_next_tmp = '<li class="disabled"><a href="#">下一页</a></li>' else: page_next_tmp = '<li><a href="{0}?page={1}">下一页</a></li>'.format(self.base_url, self.page_num + 1) page_html_list.append(page_next_tmp) # 添加一个尾页 page_last_tmp = '<li><a href="{0}?page={1}">尾页</a></li>'.format(self.base_url, self.total_page_num) page_html_list.append(page_last_tmp) return "".join(page_html_list)
相关文章推荐
- Django的Web页面上对list数据进行自定义分页
- Django 中的自定义分页标签
- django上课笔记2-视图CBV-ORM补充-Django的自带分页-Django的自定义分页
- python 学习笔记十八 django深入学习三 分页,自定义标签,权限机制
- Django框架之自定义分页
- Django自定义分页与bootstrap分页结合
- Django如何自定义分页
- Django REST Framework学习-分页,通用视图,自定义RelatedField
- Django——自定义分页(可调用)
- Django—自定义分页
- Django 中如何针对自定义的 View 做分页显示
- Django之自定义分页
- 7.django之自定义分页记录
- 第三百一十四节,Django框架,自定义分页
- Django 中如何针对自定义的 View 做分页显示
- django 自定义分页与bootstrap分页结合
- 修改Django分页类,自定义实现分页功能
- Django 中如何针对自定义的 View 做分页显示
- Django之自定义分页代码简单实现
- Django自定义分页效果