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 基础学习教程
Feb 08 Python
利用python 更新ssh 远程代码 操作远程服务器的实现代码
Feb 08 Python
python如何在列表、字典中筛选数据
Mar 19 Python
python opencv实现切变换 不裁减图片
Jul 26 Python
对python过滤器和lambda函数的用法详解
Jan 21 Python
Python实现查找二叉搜索树第k大的节点功能示例
Jan 24 Python
python 多维高斯分布数据生成方式
Dec 09 Python
Pycharm生成可执行文件.exe的实现方法
Jun 02 Python
Python爬取数据并实现可视化代码解析
Aug 12 Python
Python实现自动签到脚本的示例代码
Aug 19 Python
python zip()函数的使用示例
Sep 23 Python
详解Python Celery和RabbitMQ实战教程
Jan 20 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
Yii框架中sphinx索引配置方法解析
2016/10/18 PHP
PHP有序表查找之插值查找算法示例
2018/02/10 PHP
Thinkphp5框架实现获取数据库数据到视图的方法
2019/08/14 PHP
表单的一些基本用法与技巧
2006/07/15 Javascript
动态加载js的几种方法
2006/10/23 Javascript
学习js所必须要知道的一些
2007/03/07 Javascript
javascript 面向对象编程  function是方法(函数)
2009/09/17 Javascript
Javascript继承机制的设计思想分享
2011/08/28 Javascript
jquery动态更换设置背景图的方法
2014/03/25 Javascript
浅谈JavaScript数据类型及转换
2015/02/28 Javascript
js实现左侧网页tab滑动门效果代码
2015/09/06 Javascript
Jquery元素追加和删除的实现方法
2016/05/24 Javascript
利用JavaScript判断浏览器类型及版本
2016/08/23 Javascript
canvas实现图片根据滑块放大缩小效果
2017/02/24 Javascript
纯jQuery实现前端分页功能
2017/03/23 jQuery
微信小程序 获取javascript 里的数据
2017/08/17 Javascript
使用vue的transition完成滑动过渡的示例代码
2018/06/25 Javascript
python使用Flask框架获取用户IP地址的方法
2015/03/21 Python
Python之str操作方法(详解)
2017/06/19 Python
Python实现一个Git日志统计分析的小工具
2017/12/14 Python
django 开发忘记密码通过邮箱找回功能示例
2018/04/17 Python
Python requests及aiohttp速度对比代码实例
2020/07/16 Python
Python抓包并解析json爬虫的完整实例代码
2020/11/03 Python
突袭HTML5之Javascript API扩展4—拖拽(Drag/Drop)概述
2013/01/31 HTML / CSS
计算机专业学生求职信分享
2013/12/15 职场文书
总经理职责
2013/12/22 职场文书
办公室助理岗位职责
2013/12/25 职场文书
家庭教育先进个人事迹材料
2014/01/24 职场文书
水利局群众路线专题民主生活会发言材料
2014/09/21 职场文书
毕业实习指导教师评语
2014/12/31 职场文书
质量保证书格式模板
2015/02/27 职场文书
2015毕业生简历自我评价
2015/03/02 职场文书
巴黎圣母院读书笔记
2015/06/26 职场文书
新学期开学标语2015
2015/07/16 职场文书
爱国主题班会教案
2015/08/14 职场文书
MySQL的存储过程和相关函数
2022/04/26 MySQL