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编码时应该注意的几个情况
Mar 04 Python
使用scrapy实现爬网站例子和实现网络爬虫(蜘蛛)的步骤
Jan 23 Python
Python实现改变与矩形橡胶的线条的颜色代码示例
Jan 05 Python
在Pycharm中自动添加时间日期作者等信息的方法
Jan 16 Python
对python生成业务报表的实例详解
Feb 03 Python
python3 小数位的四舍五入(用两种方法解决round 遇5不进)
Apr 11 Python
python实现的发邮件功能示例
Sep 11 Python
pygame实现飞机大战
Mar 11 Python
Python获取浏览器窗口句柄过程解析
Jul 25 Python
关于多种方式完美解决Python pip命令下载第三方库的问题
Dec 21 Python
编写python程序的90条建议
Apr 14 Python
使用numpy实现矩阵的翻转(flip)与旋转
Jun 03 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
php+ajax实时输入自动搜索匹配的方法
2014/12/26 PHP
PHP实现HTTP断点续传的方法
2015/06/17 PHP
PHPWind9.0手动屏蔽验证码解决后台关闭验证码但是依然显示的问题
2016/08/12 PHP
PHP基于双向链表与排序操作实现的会员排名功能示例
2017/12/26 PHP
Laravel框架基于ajax实现二级联动功能示例
2019/01/17 PHP
laravel 实现向公共模板中传值 (view composer)
2019/10/22 PHP
一个tab标签切换效果代码
2009/03/27 Javascript
javascript 语法基础 想学习js的朋友可以看看
2009/12/16 Javascript
对象转换为原始值的实现方法
2016/06/06 Javascript
jQuery禁用快捷键例如禁用F5刷新 禁用右键菜单等的简单实现
2016/08/31 Javascript
基于KO+BootStrap+MVC实现的分页控件代码分享
2016/11/07 Javascript
JS中SetTimeout和SetInterval使用初探
2017/03/23 Javascript
详解node HTTP请求客户端 - Request
2017/05/05 Javascript
详解vue.js的事件处理器v-on:click
2017/06/27 Javascript
Angular2环境搭建具体操作步骤(推荐)
2017/08/04 Javascript
通过jquery获取上传文件名称、类型和大小的实现代码
2018/04/19 jQuery
node thread.sleep实现示例
2018/06/20 Javascript
angular 表单验证器验证的同时限制输入的实现
2019/04/11 Javascript
vue下使用nginx刷新页面404的问题解决
2019/08/02 Javascript
d3.js实现图形缩放平移
2019/12/19 Javascript
JavaScript 实现轮播图特效的示例
2020/11/05 Javascript
Python中urllib2模块的8个使用细节分享
2015/01/01 Python
Python创建模块及模块导入的方法
2015/05/27 Python
python简单获取数组元素个数的方法
2015/07/13 Python
Python入门_浅谈数据结构的4种基本类型
2017/05/16 Python
Python实现两个list对应元素相减操作示例
2017/06/09 Python
nginx黑名单和django限速,最简单的防恶意请求方法分享
2019/08/09 Python
Tensorflow 实现释放内存
2020/02/03 Python
自考生毕业自我鉴定
2013/10/10 职场文书
竞聘医务工作人员的自我评价分享
2013/11/04 职场文书
颁奖晚会主持词
2014/03/25 职场文书
大学生就业自我推荐信
2014/05/10 职场文书
2014年医院科室工作总结
2014/12/20 职场文书
大学教师个人总结
2015/02/10 职场文书
2015年实习单位评语
2015/03/25 职场文书
讲解MySQL增删改操作
2022/05/06 MySQL