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 面向对象 成员的访问约束
Dec 23 Python
Python使用Flask框架同时上传多个文件的方法
Mar 21 Python
简单介绍Python中的RSS处理
Apr 13 Python
Python中 Lambda表达式全面解析
Nov 28 Python
Python新手入门最容易犯的错误总结
Apr 24 Python
python读取图片的方式,以及将图片以三维数组的形式输出方法
Jul 03 Python
Python Pandas 箱线图的实现
Jul 23 Python
python破解bilibili滑动验证码登录功能
Sep 11 Python
PyCharm License Activation激活码失效问题的解决方法(图文详解)
Mar 12 Python
python实现横向拼接图片
Mar 23 Python
浅析Python requests 模块
Oct 09 Python
python爬虫beautifulsoup解析html方法
Dec 07 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遍历所有文件及文件夹的方法深入解析
2013/06/08 PHP
Ajax+PHP快速上手及简单应用说明
2013/07/24 PHP
php封装单文件上传到数据库(路径)
2017/10/15 PHP
php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
2020/02/28 PHP
JS JavaScript获取Url参数,src属性参数
2021/03/09 Javascript
jquery 模板的应用示例
2013/11/12 Javascript
javascript客户端遍历控件与获取父容器对象示例代码
2014/01/06 Javascript
浅谈JavaScript 框架分类
2014/11/10 Javascript
JavaScript中关联原型链属性特性
2016/02/13 Javascript
理解javascript中Map代替循环
2016/02/26 Javascript
js关于getImageData跨域问题的解决方法
2016/10/14 Javascript
AngularJS+Bootstrap实现多文件上传与管理
2016/11/08 Javascript
jQuery手指滑动轮播效果
2016/12/22 Javascript
vue指令以及dom操作详解
2017/03/04 Javascript
webpack file-loader和url-loader的区别
2019/01/15 Javascript
JavaScript常用工具方法封装
2019/02/12 Javascript
vue-cli3配置与跨域处理方法
2019/08/17 Javascript
CKEditor扩展插件:自动排版功能autoformat插件实现方法详解
2020/02/06 Javascript
Python中Django框架利用url来控制登录的方法
2015/07/25 Python
Python利用带权重随机数解决抽奖和游戏爆装备问题
2016/06/16 Python
python爬虫获取京东手机图片的图文教程
2017/12/29 Python
Python解析命令行读取参数--argparse模块使用方法
2018/01/23 Python
浅谈python numpy中nonzero()的用法
2018/04/02 Python
python检索特定内容的文本文件实例
2018/06/05 Python
Python3实现获取图片文字里中文的方法分析
2018/12/13 Python
Python查找最长不包含重复字符的子字符串算法示例
2019/02/13 Python
Python模块future用法原理详解
2020/01/20 Python
CSS3属性选择符介绍
2008/10/17 HTML / CSS
德国大型箱包和皮具商店:Koffer
2019/10/01 全球购物
英国电信商店:BT Shop
2019/12/17 全球购物
ShellScript面试题一则-ShellScript编程
2014/06/24 面试题
jQuery treeview树形结构应用
2021/03/24 jQuery
国际贸易个人求职信范文
2014/01/04 职场文书
劳动保障个人工作总结
2015/03/04 职场文书
2017年大学生寒假社会实践活动总结
2016/04/06 职场文书
Python中非常使用的6种基本变量的操作与技巧
2022/03/22 Python