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中映射类型的内建函数和工厂函数
Aug 19 Python
一篇文章入门Python生态系统(Python新手入门指导)
Dec 11 Python
Python 调用Java实例详解
Jun 02 Python
Python命令行解析模块详解
Feb 01 Python
Python常见字符串操作函数小结【split()、join()、strip()】
Feb 02 Python
简单实现Python爬取网络图片
Apr 01 Python
使用 Python 玩转 GitHub 的贡献板(推荐)
Apr 04 Python
python学习——内置函数、数据结构、标准库的技巧(推荐)
Apr 18 Python
python lxml中etree的简单应用
May 10 Python
使用Python的networkx绘制精美网络图教程
Nov 21 Python
已安装tensorflow-gpu,但keras无法使用GPU加速的解决
Feb 07 Python
python设置 matplotlib 正确显示中文的四种方式
May 10 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上传图片进行等比缩放可增加水印功能
2014/01/13 PHP
简单的php+mysql聊天室实现方法(附源码)
2016/01/05 PHP
php实现对文件压缩简单的方法
2019/09/29 PHP
jQuery Ajax 全解析
2009/02/08 Javascript
JS 中document.URL 和 windows.location.href 的区别
2009/11/11 Javascript
js函数调用常用方法详解
2012/12/03 Javascript
在jquery boxy中添加百度地图坐标拾取注意流程
2014/04/03 Javascript
javascript父、子页面交互技巧总结
2014/08/08 Javascript
jquery图片切换插件
2015/03/16 Javascript
jQuery获得子元素个数的方法
2015/04/14 Javascript
jQuery.prop() 使用详解
2015/07/19 Javascript
javascript生成随机数方法汇总
2015/11/12 Javascript
javascript中tostring()和valueof()的用法及两者的区别
2015/11/16 Javascript
原生js模拟淘宝购物车项目实战
2015/11/18 Javascript
jQuery中的一些常见方法小结(推荐)
2016/06/13 Javascript
详解Vuex管理登录状态
2017/11/13 Javascript
vueJs实现DOM加载完之后自动下拉到底部的实例代码
2018/08/31 Javascript
JointJS JavaScript流程图绘制框架解析
2019/08/15 Javascript
vue.js实现双击放大预览功能
2020/06/23 Javascript
在vue中使用cookie记住用户上次选择的实例(本次例子中为下拉框)
2020/09/11 Javascript
在Django中进行用户注册和邮箱验证的方法
2016/05/09 Python
用python生成1000个txt文件的方法
2018/10/25 Python
PyQt5实现从主窗口打开子窗口的方法
2019/06/19 Python
python将图片转base64,实现前端显示
2020/01/09 Python
纽约的奢华内衣店:Journelle
2016/07/29 全球购物
Europcar比利时:租车
2019/08/26 全球购物
酒店服务实习自我鉴定
2013/09/22 职场文书
大型活动组织方案
2014/05/10 职场文书
地质灾害防治方案
2014/05/14 职场文书
解除同居协议书
2015/01/29 职场文书
钱塘江大潮导游词
2015/02/03 职场文书
个人借条范本
2015/05/25 职场文书
2016秋季运动会开幕词
2016/03/04 职场文书
MySQL系列之十二 备份与恢复
2021/07/02 MySQL
JavaScript 对象创建的3种方法
2021/11/17 Javascript
python机器学习实现oneR算法(以鸢尾data为例)
2022/03/03 Python