Django自定义分页效果


Posted in Python onJune 27, 2017

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

确定分页需求:

1. 每页显示的数据条数
2. 每页显示页号链接数
3. 上一页和下一页
4. 首页和末页

效果图:

Django自定义分页效果

首先,利用django内置的分页功能,写分页类:

from django.core.paginator import Paginator, Page  # 导入django分页模块


class PageInfo(object):
 def __init__(self, current_page, all_count, base_url, per_page=10, show_page=11):
  """

  :param current_page: 当前页
  :param all_count: 总页数
  :param base_url: 模板
  :param per_page: 每页显示数据条数
  :param show_page: 显示链接页个数
  """
  #若url错误,默认显示第一页(错误类型可能为:空页面编号,非整数型页面编号)
  try:
   self.current_page = int(current_page)
  except Exception as e:
   self.current_page = 1
  
  #根据数据库信息条数得出总页数   
  a, b = divmod(all_count, per_page)
  if b:
   a += 1
  self.all_page = a 
  
  self.base_url = base_url
  self.per_page = per_page
  self.show_page = show_page

 #当前页起始数据id
 def start_data(self):  
  return (self.current_page - 1) * self.per_page

 #当前页结束数据id
 def end_data(self):  
  return self.current_page * self.per_page
 
 #动态生成前端html
 def pager(self):
  page_list = []
  half = int((self.show_page - 1)/2)
  #如果:总页数 < show_page,默认显示页数范围为: 1~总页数
  if self.all_page < self.show_page:
   start_page = 1
   end_page = self.all_page + 1
  #如果:总页数 > show_page
  else:
   #如果:current_page - half <= 0,默认显示页数范围为:1~show_page
   if self.current_page <= half:
    start_page = 1
    end_page = self.show_page + 1
   else:
    #如果:current_page + half >总页数,默认显示页数范围为:总页数 - show_page ~ 总页数
    if self.current_page + half > self.all_page:
     end_page = self.all_page + 1
     start_page = end_page - self.show_page
    else:
     start_page = self.current_page - half
     end_page = self.current_page + half + 1

  #首页
  first_page = "<li><a href='%s?page=%s'>首页</a></li>" %(self.base_url, 1)
  page_list.append(first_page)

  #上一页(若当前页等于第一页,则上一页无链接,否则链接为当前页减1)
  if self.current_page <= 1:
   prev_page = "<li><a href='#'>上一页</a></li>"
  else:
   prev_page = "<li><a href='%s?page=%s'>上一页</a></li>" %(self.base_url, self.current_page-1)
  page_list.append(prev_page)

  #动态生成中间页数链接
  for i in range(start_page, end_page):
   if i == self.current_page:
    temp = "<li class='active'><a href='%s?page=%s'>%s</a></li>" %(self.base_url, i, i)
   else:
    temp = "<li><a href='%s?page=%s'>%s</a></li>" % (self.base_url, i, i)
   page_list.append(temp)

  #下一页(若当前页等于最后页,则下一页无链接,否则链接为当前页加1)
  if self.current_page >= self.all_page:
   next_page = "<li><a href='#'>下一页</a></li>"
  else:
   next_page = "<li><a href='%s?page=%s'>下一页</a></li>" %(self.base_url, self.current_page+1)
  page_list.append(next_page)

  #末页(若总页数只有一页,则无末页标签)
  if self.all_page > 1:
   last_page = "<li><a href='%s?page=%s'>末页</a></li>" % (self.base_url, self.all_page)
   page_list.append(last_page)

  return ''.join(page_list)

然后,在views中写方法(此处写在app01中):

from utils.pagnition import PageInfo # 从文件中导入上步自定义的分页模块

def custom(request):
 all_count = models.UserInfo.objects.all().count() 
 # 获取要显示数据库的总数据条数
 page_info = PageInfo(request.GET.get('page'), all_count, '/custom.html/',)  
 # 生成分页对象
 user_list = models.UserInfo.objects.all()[page_info.start_data():page_info.end_data()]  
 # 利用分页对象获取当前页显示数据
 return render(request, 'custom.html', {'user_list': user_list, 'page_info': page_info}) 
 # 模板渲染

然后,在templates目录下写“custom.html"文件:

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>customers</title>
{# 引入bootstrap样式#}
 <link rel="stylesheet" href="/static/plugins/bootstrap-3.3.7-dist/css/bootstrap.css">
</head>
<body>
<h1>customers</h1>
{#当前页显示的数据#}
<ul>
 {% for row in user_list %}
  <li>{{ row.name }}</li>
 {% endfor %}
</ul>

{#分页#}
 <nav aria-label="Page navigation">
  <ul class="pagination">
{#    传入page_info.pager#}
   {{ page_info.pager|safe }}
  </ul>
 </nav>

</body>
</html>

最后,新增url关系(urls.py):

from django.conf.urls import url
 from django.contrib import admin
 from app01 import views as app01_views
 
 urlpatterns = [
  url(r'^custom.html/$', app01_views.custom),
 ]

至此,就完成了利用django的分页功能自定义分页模块,可以应用在不同的业务页面上。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
用Python的线程来解决生产者消费问题的示例
Apr 02 Python
Python实现批量检测HTTP服务的状态
Oct 27 Python
python抓取网页中链接的静态图片
Jan 29 Python
详解Tensorflow数据读取有三种方式(next_batch)
Feb 01 Python
Python socket模块实现的udp通信功能示例
Apr 10 Python
Python对象转换为json的方法步骤
Apr 25 Python
使用python实现mqtt的发布和订阅
May 05 Python
对django的User模型和四种扩展/重写方法小结
Aug 17 Python
为什么说Python可以实现所有的算法
Oct 04 Python
Python预测2020高考分数和录取情况
Jul 08 Python
Python页面加载的等待方式总结
Feb 28 Python
深度学习小工程练习之垃圾分类详解
Apr 14 Python
Python读取和处理文件后缀为.sqlite的数据文件(实例讲解)
Jun 27 #Python
最近Python有点火? 给你7个学习它的理由!
Jun 26 #Python
Python的装饰器使用详解
Jun 26 #Python
Python学习思维导图(必看篇)
Jun 26 #Python
python flask 多对多表查询功能
Jun 25 #Python
Python的语言类型(详解)
Jun 24 #Python
Python队列的定义与使用方法示例
Jun 24 #Python
You might like
咖啡知识 除了喝咖啡还有那些知识点
2021/03/06 新手入门
php取整函数ceil,floo,round的用法及介绍
2013/08/31 PHP
php5.3以后的版本连接sqlserver2000的方法
2014/07/28 PHP
一个简单的Ext.XTemplate的实例代码
2012/03/18 Javascript
让你的博客飘雪花超出屏幕依然看得见
2013/01/04 Javascript
Javascript中prototype属性实现给内置对象添加新的方法
2015/05/14 Javascript
在AngularJS中使用AJAX的方法
2015/06/17 Javascript
jquery中的工具使用方法$.isFunction, $.isArray(), $.isWindow()
2015/08/09 Javascript
jQuery实现的简单折叠菜单(折叠面板)效果代码
2015/09/16 Javascript
ANGULARJS中使用JQUERY分页控件
2015/09/16 Javascript
thinkphp标签实现bootsrtap轮播carousel实例代码
2017/02/19 Javascript
详解nodejs微信公众号开发——1.接入微信公众号
2017/04/10 NodeJs
JavaScript异步上传图片文件的实例代码
2017/07/04 Javascript
webpack打包多页面的方法
2018/11/30 Javascript
整理 node-sass 安装失败的原因及解决办法(小结)
2020/02/19 Javascript
vscode 插件开发 + vue的操作方法
2020/06/05 Javascript
小程序实现列表展开收起效果
2020/07/29 Javascript
[48:28]完美世界DOTA2联赛循环赛FTD vs Magma第二场 10月30日
2020/10/31 DOTA
Python利用IPython提高开发效率
2016/08/10 Python
python实现二叉树的遍历
2017/12/11 Python
基于python requests库中的代理实例讲解
2018/05/07 Python
通过Py2exe将自己的python程序打包成.exe/.app的方法
2018/05/26 Python
python取数作为临时极大值(极小值)的方法
2018/10/15 Python
django配置连接数据库及原生sql语句的使用方法
2019/03/03 Python
Python3.5 + sklearn利用SVM自动识别字母验证码方法示例
2019/05/10 Python
如何基于Python实现电子邮件的发送
2019/12/16 Python
python制作抽奖程序代码详解
2021/01/15 Python
CSS3 函数技巧 用css 实现js实现的事情(clac Counters Tooltip)
2017/08/15 HTML / CSS
canvas学习笔记之2d画布基础的实现
2019/02/21 HTML / CSS
银行自荐信范文
2013/10/07 职场文书
房地产销售员的自我评价分享
2013/12/04 职场文书
国庆65周年演讲稿:回首往昔,展望未来
2014/09/21 职场文书
关于随地扔垃圾的检讨书
2014/09/30 职场文书
2014年客户经理工作总结
2014/11/20 职场文书
2014七年级班主任工作总结
2014/12/05 职场文书
python 对图片进行简单的处理
2021/06/23 Python