zoukankan      html  css  js  c++  java
  • Django框架基础之分页

    Django内置分页:

    只适用于只有上一页和下一样的页面
     1 def index(request):
     2 
     3     current_page=request.GET.get('page')
     4     user_list=models.UserInfo.objects.all()
     5     paginator=Paginator(user_list,10)
     6     # per_page: 每页显示条目数量
     7     # count:    数据总个数
     8     # num_pages:总页数
     9     # page_range:总页数的索引范围,如: (1,10),(1,200)
    10     # page:     page对象
    11     try:
    12         posts=paginator.page(current_page)
    13         # has_next              是否有下一页
    14         # next_page_number      下一页页码
    15         # has_previous          是否有上一页
    16         # previous_page_number  上一页页码
    17         # object_list           分页之后的数据列表
    18         # number                当前页
    19         # paginator             paginator对象
    20     except PageNotAnInteger as e:
    21         posts=paginator.page(1)
    22     except EmptyPage as e:
    23         posts=paginator.page(1)
    24     return render(request,'index.html',{'posts':posts})
    View Code
     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>Title</title>
     6 </head>
     7 <body>
     8 <h1>用户列表</h1>
     9 <ul>
    10     {% for row in posts.object_list %}
    11          <li>{{ row.name }}</li>
    12     {% endfor %}
    13 </ul>
    14 <div>
    15     {% if posts.has_previous %}
    16         <a href="/index.html?page={{ posts.previous_page_number }}">上一页</a>
    17     {% endif %}
    18      {% if posts.has_next %}
    19          <a href="/index.html?page={{ posts.next_page_number }}">下一页</a>
    20      {% endif %}
    21 </div>
    22 </body>
    23 </html>
    html

    自定义分页:(其内部应用的就是mysql中的limit方法)

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

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

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

    3、设定显示多少页号

    4、获取当前数据总条数

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

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

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

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

     1 class PageInfo(object):
     2     def __init__(self,current_page,all_count,per_page,base_url,show_page=11):
     3         '''
     4 
     5         :param current_page:  当前页
     6         :param all_count: 全部数据行数
     7         :param per_page: 每页显示的数据行数
     8         :param base_url: 要跳转的url
     9         :param show_page: 每页显示的页数
    10         '''
    11         try:
    12 
    13             self.current_page = int(current_page)
    14         except Exception as e:
    15             self.current_page = 1
    16 
    17         self.per_page=per_page
    18 
    19         a, b = divmod(all_count,per_page)
    20         if b:
    21             a = a + 1
    22         self.all_pager = a
    23         self.show_page = show_page
    24         self.base_url=base_url
    25     def start(self):  #当前页的数据第一行的索引
    26         return (self.current_page-1)*self.per_page
    27 
    28     def end(self):    #当前页的数据最后一行的索引
    29         return self.current_page*self.per_page
    30 
    31     def pager(self):
    32         # v = "<a href='/custom.html?page=1'>1</a><a href='/custom.html?page=2'>2</a>"
    33         # return v
    34         page_list=[]
    35 
    36         half =int((self.show_page-1)/2)
    37 
    38         #如果数据总页数《 要显示的页数
    39         if self.all_pager < self.show_page:
    40             begin=1
    41             stop=self.all_pager
    42         else:
    43             #如果数据总页数大于要显示的页数  并且当前页数小于等于5(只显示1-11)
    44             if self.current_page <= half:
    45                 begin=1
    46                 stop=self.show_page
    47             else:
    48                 # 如果数据总页数大于要显示的页数  并且当前页数+5 大于最大页数(只显示最大页-11,最大页)
    49                 if self.current_page + half > self.all_pager:
    50                     stop=self.all_pager +1
    51                     begin=self.all_pager - self.show_page +1
    52                 else:
    53                     # 正常情况下,显示当前页数的前后5页
    54                     begin = self.current_page - half
    55                     stop = self.current_page + half + 1
    56 
    57         if self.current_page <= 1:
    58             prev = "<li><a  >上一页</a><li>"
    59         else:
    60             prev="<li><a  href='%s?page=%s'>上一页</a><li>"%(self.base_url,self.current_page-1,)
    61         page_list.append(prev)
    62 
    63         for i in range(begin,stop):
    64             if i == self.current_page:
    65                 temp="<li class='active'><a href='%s?page=%s'>%s</a><li>"%(self.base_url,i,i)
    66             else:
    67                 temp = "<li><a  href='%s?page=%s'>%s</a><li>" % (self.base_url,i, i)
    68             page_list.append(temp)
    69 
    70         if self.current_page >= self.all_pager:
    71             nex="<li><a  href='%s?page=%s'>下一页</a><li>"%(self.base_url,self.current_page,)
    72         else:
    73             nex="<li><a  href='%s?page=%s'>下一页</a><li>"%(self.base_url,self.current_page+1,)
    74         page_list.append(nex)
    75 
    76         return ''.join(page_list)
    1 def custom(request):
    2 
    3     all_count=models.UserInfo.objects.all().count()
    4 
    5     page_info=PageInfo(request.GET.get('page'),all_count,10,'/custom.html')
    6     custom_list=models.UserInfo.objects.all()[page_info.start():page_info.end()]
    7     return render(request,'custom.html',{'custom_list':custom_list,'page_info':page_info})
    应用
     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>Title</title>
     6     <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css">
     7 </head>
     8 <body>
     9    <p>用户列表</p>
    10 
    11    <ul>
    12        {% for row in custom_list %}
    13        <li>
    14          {{ row.name }}
    15        </li>
    16 
    17       {% endfor %}
    18    </ul>
    19 
    20    <nav aria-label="Page navigation">
    21   <ul class="pagination">
    22    {{ page_info.pager|safe}}
    23   </ul>
    24 </nav>
    25 
    26 
    27 
    28 </body>
    29 </html>
    View Code
  • 相关阅读:
    4.net基础之委托事件
    2.net基础之反射
    绕过百度网盘速度限制直接下载百度网盘文件
    1.net基础之泛型
    网页图片按需加载
    小米官网图片轮播
    html+css3实现网页时钟
    接口自动化测试方案详解
    接口测试用例设计实践总结
    Mysql 高可用(MHA)-读写分离(Atlas)
  • 原文地址:https://www.cnblogs.com/liuguniang/p/7106026.html
Copyright © 2011-2022 走看看