zoukankan      html  css  js  c++  java
  • python之路--web--2--Django-8-分页

    一、分页

    一、Django内置分页

    Django在通过url传递参数的时候,参数之间是通过'&'连接在一起的,如:http://127.0.0.1:8000/a/paginat?p=17&s=1111&t=2222, 共传递了三个参数p, s, t。

    后台获取的时候通过request.GET.get('p')/request.GET.get('s')/request.GET.get('t')获取,

    路由设置的时候,只需要匹配

    url(r'^paginat$', views.pagination),

    就能把这些带参数的请求都匹配上。

    前台与后台在数据交换的过程中,往往需要处理安全问题,默认Django会将所有的数据转换为字符串,但是有时需要将这些字符串嵌入到html代码中,必须转换为html代码,两种方式:

    1.

    {{ page_str|safe }}

    2.

    from django.utils.safestring import mark_safe

    mark_safe(page_str)

     1 # views.py
     2 from django.shortcuts import render
     3 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
     4 
     5 L = []
     6 for i in range(999):
     7     L.append(i)
     8 
     9 def index(request):
    10     current_page = request.GET.get('p')
    11 
    12     paginator = Paginator(L, 10)
    13     # per_page: 每页显示条目数量
    14     # count:    数据总个数
    15     # num_pages:总页数
    16     # page_range:总页数的索引范围,如: (1,10),(1,200)
    17     # page:     page对象
    18     try:
    19         posts = paginator.page(current_page)
    20         # has_next              是否有下一页
    21         # next_page_number      下一页页码
    22         # has_previous          是否有上一页
    23         # previous_page_number  上一页页码
    24         # object_list           分页之后的数据列表
    25         # number                当前页
    26         # paginator             paginator对象
    27     except PageNotAnInteger:
    28         posts = paginator.page(1)
    29     except EmptyPage:
    30         posts = paginator.page(paginator.num_pages)
    31     return render(request, 'index.html', {'posts': posts})
    32 
    33 views.py
    xx.html
    1
    <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta charset="UTF-8"> 5 <title></title> 6 </head> 7 <body> 8 <ul> 9 {% for item in posts %} 10 <li>{{ item }}</li> 11 {% endfor %} 12 </ul> 13 14 <div class="pagination"> 15 <span class="step-links"> 16 {% if posts.has_previous %} 17 <a href="?p={{ posts.previous_page_number }}">Previous</a> 18 {% endif %} 19 <span class="current"> 20 Page {{ posts.number }} of {{ posts.paginator.num_pages }}. 21 </span> 22 {% if posts.has_next %} 23 <a href="?p={{ posts.next_page_number }}">Next</a> 24 {% endif %} 25 </span> 26 27 </div> 28 </body> 29 </html>
    扩展内置分页 views.py
    1
    from django.shortcuts import render 2 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger 3 4 5 class CustomPaginator(Paginator): 6 def __init__(self, current_page, max_pager_num, *args, **kwargs): 7 """ 8 :param current_page: 当前页 9 :param max_pager_num:最多显示的页码个数 10 :param args: 11 :param kwargs: 12 :return: 13 """ 14 self.current_page = int(current_page) 15 self.max_pager_num = max_pager_num 16 super(CustomPaginator, self).__init__(*args, **kwargs) 17 18 def page_num_range(self): 19 # 当前页面 20 # self.current_page 21 # 总页数 22 # self.num_pages 23 # 最多显示的页码个数 24 # self.max_pager_num 25 print(1) 26 if self.num_pages < self.max_pager_num: 27 return range(1, self.num_pages + 1) 28 print(2) 29 part = int(self.max_pager_num / 2) 30 if self.current_page - part < 1: 31 return range(1, self.max_pager_num + 1) 32 print(3) 33 if self.current_page + part > self.num_pages: 34 return range(self.num_pages + 1 - self.max_pager_num, self.num_pages + 1) 35 print(4) 36 return range(self.current_page - part, self.current_page + part + 1) 37 38 39 L = [] 40 for i in range(999): 41 L.append(i) 42 43 def index(request): 44 current_page = request.GET.get('p') 45 paginator = CustomPaginator(current_page, 11, L, 10) 46 # per_page: 每页显示条目数量 47 # count: 数据总个数 48 # num_pages:总页数 49 # page_range:总页数的索引范围,如: (1,10),(1,200) 50 # page: page对象 51 try: 52 posts = paginator.page(current_page) 53 # has_next 是否有下一页 54 # next_page_number 下一页页码 55 # has_previous 是否有上一页 56 # previous_page_number 上一页页码 57 # object_list 分页之后的数据列表 58 # number 当前页 59 # paginator paginator对象 60 except PageNotAnInteger: 61 posts = paginator.page(1) 62 except EmptyPage: 63 posts = paginator.page(paginator.num_pages) 64 65 return render(request, 'index.html', {'posts': posts})
    扩展内置分页html
    1
    <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta charset="UTF-8"> 5 <title></title> 6 </head> 7 <body> 8 9 <ul> 10 {% for item in posts %} 11 <li>{{ item }}</li> 12 {% endfor %} 13 </ul> 14 15 <div class="pagination"> 16 <span class="step-links"> 17 {% if posts.has_previous %} 18 <a href="?p={{ posts.previous_page_number }}">Previous</a> 19 {% endif %} 20 21 {% for i in posts.paginator.page_num_range %} 22 <a href="?p={{ i }}">{{ i }}</a> 23 {% endfor %} 24 25 {% if posts.has_next %} 26 <a href="?p={{ posts.next_page_number }}">Next</a> 27 {% endif %} 28 </span> 29 30 <span class="current"> 31 Page {{ posts.number }} of {{ posts.paginator.num_pages }}. 32 </span> 33 34 </div> 35 </body> 36 </html>

    二、自定义分页

    分页功能在每个网站都是必要的,对于分页来说,其实就是根据用户的输入计算出应该在数据库表中的起始位置。

    1、设定每页显示数据条数

    2、用户输入页码(第一页、第二页...)

    3、根据设定的每页显示条数和当前页码,计算出需要取数据表的起始位置

    4、在数据表中根据起始位置取值,页面上输出数据


    需求又来了,需要在页面上显示分页的页面。如:[上一页][1][2][3][4][5][下一页]

    1、设定每页显示数据条数

    2、用户输入页码(第一页、第二页...)

    3、设定显示多少页号

    4、获取当前数据总条数

    5、根据设定显示多少页号和数据总条数计算出,总页数

    6、根据设定的每页显示条数和当前页码,计算出需要取数据表的起始位置

    7、在数据表中根据起始位置取值,页面上输出数据

    8、输出分页html,如:[上一页][1][2][3][4][5][下一页]

    分页实例 
    1
    #!/usr/bin/env python 2 # _*_coding:utf-8_*_ 3 from django.utils.safestring import mark_safe 4 5 class PageInfo(object): 6 def __init__(self,current,totalItem,peritems=5): 7 self.__current=current 8 self.__peritems=peritems 9 self.__totalItem=totalItem 10 def From(self): 11 return (self.__current-1)*self.__peritems 12 def To(self): 13 return self.__current*self.__peritems 14 def TotalPage(self): #总页数 15 result=divmod(self.__totalItem,self.__peritems) 16 if result[1]==0: 17 return result[0] 18 else: 19 return result[0]+1 20 21 def Custompager(baseurl,currentPage,totalpage): #基础页,当前页,总页数 22 perPager=11 23 #总页数<11 24 #0 -- totalpage 25 #总页数>11 26 #当前页大于5 currentPage-5 -- currentPage+5 27 #currentPage+5是否超过总页数,超过总页数,end就是总页数 28 #当前页小于5 0 -- 11 29 begin=0 30 end=0 31 if totalpage <= 11: 32 begin=0 33 end=totalpage 34 else: 35 if currentPage>5: 36 begin=currentPage-5 37 end=currentPage+5 38 if end > totalpage: 39 end=totalpage 40 else: 41 begin=0 42 end=11 43 pager_list=[] 44 if currentPage<=1: 45 first="<a href=''>首页</a>" 46 else: 47 first="<a href='%s%d'>首页</a>" % (baseurl,1) 48 pager_list.append(first) 49 50 if currentPage<=1: 51 prev="<a href=''>上一页</a>" 52 else: 53 prev="<a href='%s%d'>上一页</a>" % (baseurl,currentPage-1) 54 pager_list.append(prev) 55 56 for i in range(begin+1,end+1): 57 if i == currentPage: 58 temp="<a href='%s%d' class='selected'>%d</a>" % (baseurl,i,i) 59 else: 60 temp="<a href='%s%d'>%d</a>" % (baseurl,i,i) 61 pager_list.append(temp) 62 if currentPage>=totalpage: 63 next="<a href='#'>下一页</a>" 64 else: 65 next="<a href='%s%d'>下一页</a>" % (baseurl,currentPage+1) 66 pager_list.append(next) 67 if currentPage>=totalpage: 68 last="<a href=''>末页</a>" 69 else: 70 last="<a href='%s%d'>末页</a>" % (baseurl,totalpage) 71 pager_list.append(last) 72 result=''.join(pager_list) 73 return mark_safe(result) #把字符串转成html语言

    总结,分页时需要做三件事:

    • 创建处理分页数据的类
    • 根据分页数据获取数据
    • 输出分页HTML,即:[上一页][1][2][3][4][5][下一页]
  • 相关阅读:
    (设计模式)组合模式
    redis 集群部署 (linux)
    redis 集群 配置文件
    redis 外部访问配置(bind正确配置)
    (设计模式)桥模式
    (springboot)freemarker(二)
    (springboot)入门(一)
    (设计模式)抽象工厂
    (设计模式)建造者模式
    (设计模式)原型
  • 原文地址:https://www.cnblogs.com/eaglesour/p/7988917.html
Copyright © 2011-2022 走看看