A-A+

Django分页功能(二)

2014年11月22日 Django, 自动化运维 评论 4 条 阅读 14,954 views 次

django结合Bootstrap样式做的,先看效果图:

django分页

django分页

在django的views中,写了一个django分页的类,以便各个需要分页的地方调用,

以下是分页类的代码:

  1. class paging():
  2.     '''
  3.     此为文章分页功能,需要往里传递三个参数,分别如下:
  4.     tablename:表名
  5.     id:页码号,即第几页,这个一般从URL的GET中得到
  6.     pagenum:每页显示多少条记录
  7.     '''
  8.     def __init__(self,tablename,id,pagenum):
  9.         self.tablename = tablename
  10.         self.page = int(id)
  11.         self.pagenum = int(pagenum)
  12.         tn = self.tablename.objects.all().order_by('-id')           #查询tablename表中所有记录数,并以降序的方式对id进行排列
  13.         self.p = Paginator(tn,self.pagenum)                         #对表数据进行分页,每页显示pagenum条
  14.         self.p_count = self.p.count                                 #数据库共多少条记录
  15.         self.p_pages = self.p.num_pages                             #共可分成多少页
  16.         self.p_content = self.p.page(self.page).object_list         #第N页的内容列表
  17.         self.p_isprevious = self.p.page(self.page).has_previous()   #是否有上一页,返回True或False
  18.         self.p_isnext = self.p.page(self.page).has_next()           #是否有下一页,返回True或False
  19.         #获取上一页页码号,如果try报错,说明此页为最后一页,那就设置最后一页为1
  20.         try:
  21.             self.p_previous = self.p.page(self.page).previous_page_number()  #上一页页码号
  22.         except:
  23.             self.p_previous = '1'
  24.         #获取下一页页码号,如果try报错,说明此页为最后一页,那就设置最后一页为self.p_pages
  25.         try:
  26.             self.p_next = self.p.page(self.page).next_page_number()
  27.         except:
  28.             self.p_next = self.p_pages
  29.         #p_id获取当前页码,此变量是传递给模板用的,用于判断后,高亮当前页页码
  30.         self.p_id = int(id)
  31.     def p_range(self):
  32.         '''
  33.         获取页码列表
  34.         当前页小于5时,取1-9页的列表
  35.         最后页减当前页,小于5时,取最后9页的列表
  36.         不属于以上2个规则的,则取当前页的前5和后4,共9页的列表
  37.         '''
  38.         if self.page < 5:
  39.             p_list = self.p.page_range[0:9]
  40.         elif int(int(self.p.num_pages) - self.page) < 5:
  41.             p_list = self.p.page_range[-9:]
  42.         else:
  43.             p_list = self.p.page_range[self.page-5:self.page+4]
  44.         return p_list

 

 

以下是views中,关于查看日志的后端python代码:

  1. def show_version(request,id):
  2.     per = request.session
  3.     username = per.get('username',u'访问')
  4.     if per.get('per_global',False) != '1':
  5.         create_db(username,'失败',u'访问前端更新记录页面,无权限' ,'系统平台','日志系统')
  6.         return HttpResponseRedirect('404.html')
  7.     p = paging(Ver_front,id,17)
  8.     return render(request,'show_version.html',locals())

注:p = paging(Ver_front,id,17) 中的Ver_front是数据库表名,id是当前页(url中传递过来的),17是指每页显示17条数据。就这么简单,后代码就搞定了分页的调用,剩下 的就是前端模板部分了。

 

以下是models中关于Ver_front的代码(字符长度,没有做什么优化,基本都是用max_length=50):

  1. class Ver_front(models.Model):
  2.     item = models.CharField(max_length=50)
  3.     flash = models.CharField(max_length=50)
  4.     bin = models.CharField(max_length=50)
  5.     status = models.CharField(max_length=2)
  6.     dtime = models.CharField(max_length=50)

 

以下是前端模板页中关于分页的代码:

  1. <div class="row-fluid">
  2.     <div class="block">
  3.         <a href="#tablewidget" class="block-heading" data-toggle="collapse">前端版本发布记录</a>
  4.         <div id="tablewidget" class="block-body collapse in">
  5.             <table class="table">
  6.               <thead>
  7.                 <tr>
  8.                   <th>版本号</th>
  9.                   <th>项目名</th>
  10.                   <th>bin版本号</th>
  11.                   <th>flash版本号</th>
  12.                   <th>发布时间</th>
  13.                   <td>操作</td>
  14.                 </tr>
  15.               </thead>
  16.               <tbody>
  17.                 {% for i in p.p_content %}
  18.                 <tr>
  19.                   <td>{{i.id}}</td>
  20.                   <td>{{i.item}}</td>
  21.                   <td>{{i.bin}}</td>
  22.                   <td>{{i.flash}}</td>
  23.                   <td>{{i.dtime}}</td>
  24.                   <td>删除</td>
  25.                 </tr>
  26.                 {% endfor %}
  27.               </tbody>
  28.             </table>
  29.         </div>
  30.     </div>
  31.     <div>
  32.     <div id="pagination_div1">
  33.         <ul class="pagination" >
  34.         共 <span  class="badge">{{p.p_count}}</span> 条记录,总 <span  class="badge">{{p.p_pages}}</span> 页,当前在<span  class="badge">{{id}}</span>页
  35.         </ul>
  36.     </div>
  37.     <div id="pagination_div2">
  38.         <nav>
  39.             <ul class="pagination" >
  40.                 <li><a href="/show_version-{{p.p_previous}}.html">&laquo;</a></li>
  41.                 <li> <a href="/show_version-1.html">首页</a></li>
  42.                     {% for i in p.p_range %}
  43.                         <li  {% ifequal p.p_id i %} class="active" {% endifequal %}><a href="/show_version-{{i}}.html">{{i}}</a></li>
  44.                     {% endfor %}
  45.                 <li> <a href="/show_version-{{p.p_pages}}.html">尾页</a></li>
  46.                 <li><a href="/show_version-{{p.p_next}}.html">&raquo;</a></li>
  47.             </ul>
  48.         </nav>
  49.     </div>
  50.     </div>
  51. </div>

关于样式,就不发了,用的是Bootstrap。用到的后端变量,都用红色粗体显示。(效果图和代码有出入,但分页效果是一样的。)

关键词:

4 条留言  访客:3 条  博主:1 条

  1. avatar weiran

    求教:views代码中的”def show_version(request,id)”,这个id是怎么传递的,注解中说“id是当前页(url中传递过来的)”,前面的提问者问道“url如何配置的”,不知道和我问这个是不是一个问题

    • avatar weiran

      url传递id参数,我搞定了

  2. avatar wendy

    我想问下你的url如何配置的 ? 我一直做这个分页没弄好 谢谢

    • avatar admin

      使用get方式

给我留言

Copyright © linux系统运维 保留所有权利.   Theme  Ality 粤ICP备13023035号-1

用户登录

分享到: