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实现2014火车票查询代码分享
Jan 10 Python
Python中用max()方法求最大值的介绍
May 15 Python
浅谈function(函数)中的动态参数
Apr 30 Python
Python random模块用法解析及简单示例
Dec 18 Python
python中reader的next用法
Jul 24 Python
在python中对变量判断是否为None的三种方法总结
Jan 23 Python
Python二叉搜索树与双向链表转换算法示例
Mar 02 Python
django的settings中设置中文支持的实现
Apr 28 Python
Python实现微信中找回好友、群聊用户撤回的消息功能示例
Aug 23 Python
Python读入mnist二进制图像文件并显示实例
Apr 24 Python
使用keras实现BiLSTM+CNN+CRF文字标记NER
Jun 29 Python
详解Python牛顿插值法
May 11 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/02 无线电
php fsockopen中多线程问题的解决办法[翻译]
2011/11/09 PHP
php将图片保存入mysql数据库失败的解决方法
2014/12/27 PHP
php自定义分页类完整实例
2015/12/25 PHP
详解Yii2 之 生成 URL 的方法
2017/06/16 PHP
使用CSS和jQuery模拟select并附提交后取得数据的代码
2013/10/18 Javascript
window.onresize 多次触发的解决方法
2013/11/08 Javascript
js实现鼠标感应图片展示的方法
2015/02/27 Javascript
jQuery实现的动态伸缩导航菜单实例
2015/05/07 Javascript
全面解析Bootstrap弹窗的实现方法
2015/12/01 Javascript
使用json来定义函数,在里面可以定义多个函数的实现方法
2016/10/28 Javascript
基于javascript实现的购物商城商品倒计时实例
2016/12/11 Javascript
webpack-dev-server远程访问配置方法
2018/02/22 Javascript
js正则相关知识点专题
2018/05/10 Javascript
javascript的delete运算符知识点总结
2019/11/19 Javascript
微信小程序实现多选框全选与反全选及购物车中删除选中的商品功能
2019/12/17 Javascript
vue-router 路由传参用法实例分析
2020/03/06 Javascript
Python实现的rsa加密算法详解
2018/01/24 Python
Python实现的三层BP神经网络算法示例
2018/02/07 Python
pytorch中tensor的合并与截取方法
2018/07/26 Python
python爬虫框架scrapy实现模拟登录操作示例
2018/08/02 Python
Pandas DataFrame 取一行数据会得到Series的方法
2018/11/10 Python
python 实现dict转json并保存文件
2019/12/05 Python
CSS 说明横向进度条最后显示文字的实现代码
2020/11/10 HTML / CSS
serialVersionUID具有什么样的特征
2014/02/20 面试题
历史系毕业生自荐信
2013/10/28 职场文书
教育学专业实习生的自我鉴定
2013/11/26 职场文书
职工运动会邀请函
2014/02/02 职场文书
毕业生自荐信如何写
2014/03/24 职场文书
运动会口号16字
2014/06/07 职场文书
2014年客房部工作总结
2014/11/22 职场文书
2015年英语教师工作总结
2015/05/20 职场文书
2016反腐倡廉警示教育心得体会
2016/01/13 职场文书
2019年年中工作总结讲话稿模板
2019/03/25 职场文书
Redis持久化与主从复制的实践
2021/04/27 Redis
纯html+css实现奥运五环的示例代码
2021/08/02 HTML / CSS