分页功能在每个网站都是必要的,对于分页来说,其实就是根据用户的输入计算出应该显示在页面上的数据在数据库表中的起始位置。

1. 每页显示的数据条数
2. 每页显示页号链接数
3. 上一页和下一页
4. 首页和末页 一、Django自带分页器
from django.core.paginator import Paginator,EmptyPage,PageNotAnInteger

def index(request):
#大批量插入数据
# booklist=[]
# for i in range(100):
# obj=models.Book(name='book %s'%i,price=30+i*2)
# booklist.append(obj)
# models.Book.objects.bulk_create(booklist)
#-------Paginator类的使用
book_lists=models.Book.objects.all()
# Paginator(分页对象,每1页显示X条目)
# -------------------------分页对象的属性
p=Paginator(book_lists,10)
#p.count s数据总条目 例 100
print(p.count)
#p.num_pages 可以分多少页 5
print(p.num_pages)
#page_range 页码列表 [1,2,3,4,5]
print(p.page_range)
#--------------------------------------------------
# 以上都是和Paginator总页数对象相关的内容,一下是和单页相关的内容
#第1页的page对象
page1=p.page(1)
# 获取第1页所有数据
print(page1.object_list)
#第2页page对象
page2 = p.page(2)
#获取第2页所有数据
print(page2.object_list)
# 可以单页的数据,就可以从前端传数据动态取第几页了!
#-----------------------------------------------------------------
视图
page_number = request.GET.get("page")
book_lists = models.Book.objects.all()
p=Paginator(book_lists,20)
try:
book_list=p.page(page_number)
#如果用户输入的页码超出 范围,显示末页
except EmptyPage:
book_list=p.page(p.num_pages)
#如果用户输入的页码是字符串等无效页码,显示第1页
except PageNotAnInteger:
book_list=p.page(1)
return render(request,'index.html',locals())

前端

<nav aria-label="Page navigation" style="position: fixed;bottom: 5px;right: 50%">
<ul class="pagination">
{% if book_list.has_previous %}
<li><a href="/index/?page={{ book_list.previous_page_number }}">上页 <span
class="sr-only">(current)</span></a></li>
{% else %}
<li class="disabled"><a href="#">上页</a></li>
{% endif %}
{% for page in p.page_range %}
<li><a href="/index/?page={{ page }}">{{ page }} <span class="sr-only">(current)</span></a></li>
{% endfor %}
{% if book_list.has_next %}
<li><a href="/index/?page={{ book_list.next_page_number }}">下页 <span
class="sr-only">(current)</span></a></li>
{% else %}
<li class="disabled"><a href="#">下页</a></li>
{% endif %} </ul>
</nav>

[10/Oct/2018 09:22:10] "GET /favicon.ico HTTP/1.1" 200 12
/root/cmdb_rbac_arya/multitask/logs_handler.py:19: UnorderedObjectListWarning: Pagination may yield inconsistent results with an unordered object_list: <class 'cmdb.models.Task'> QuerySet.
p = Paginator(task_objects,5)
[10/Oct/2018 09:22:23] "GET /multitask/task/ HTTP/1.1" 200 47420

出现以上报错是因为QuerySet无序导致,order_by('pk')即可。


二、自定制分页器

视图
class PageInfo(object):
def __init__(self,current_page,all_count,per_page,show_page=11):
try: #如果用户传入的页码异常 就让页码=1
self.current_page=int(current_page)
except Exception:
self.current_page = 1
self.show_page=show_page
self.per_page=per_page
a,b=divmod(all_count,per_page) #计算显示数据库一共需要 多少总页码
if b:
a=a+1
self.all_page=a def start(self):
return (self.current_page-1)* self.per_page def stop(self):
return self.current_page*self.per_page def pager(self): #该方法专门用于 在前端显示页码 half=int((self.show_page-1)/2) #如数据库 数据条目 小于 11条
if self.all_page < self.show_page:
begin=1
stop=self.all_page+1
else:
#如果当前页小于=5 起始页再减去5就是负数了那么 就 显示0-11页码
if self.current_page<=half:
begin =1
stop=self.show_page+1
else:
begin=self.current_page-half
stop=self.current_page+half+1
page_list = []
if self.current_page<=1: #如果当前页是1了就不要在上一页了
b = '<a href="/index?page=#">上一页</a>'
else:
b='<a href="/index?page=%s">上一页</a>'%(self.current_page-1)
page_list.append(b) for i in range(begin,stop):
if i ==self.current_page:
temp='<a style="display: inline-block;padding: 5px;margin: 5px;background-color: bisque" href="/index?page=%s">%s</a>'%(i,i)
else:
temp = '<a style="display: inline-block;padding: 5px;margin: 5px;href="/index?page=%s">%s</a>'% (i,i) page_list.append(temp)
if self.current_page >= self.all_page:
nex = "<li><a href='#'>下一页</a></li>"
else:
nex ='<a href="/index?page=%s">下一页</a>' % (self.current_page+1)
page_list.append(nex)
return ''.join(page_list) 下面是一个套用实例 def index(request):
all_count=models.Boy.objects.all().count()#计算一共 数据库中一共多少条数据
user_info=PageInfo(request.GET.get('page'),all_count,2)
user_list=models.Boy.objects.all()[user_info.start():user_info.stop()]
return render(request,'index.html',{'user_list':user_list,'page_info':user_info})

前端显示

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<ul>
{% for row in user_list %}
<li>{{ row.username}}</li>
{% endfor %}
</ul>
{{ page_info.pager|safe}}
{# 把Python的对象传入模板,自动执行,|safe 显示#}
</body> </html>

参考:http://www.cnblogs.com/yuanchenqi/articles/7439088.html#3770465

http://www.cnblogs.com/yuanchenqi/articles/7439088.html#3770465

Django之自定义分页的更多相关文章

  1. django上课笔记2-视图CBV-ORM补充-Django的自带分页-Django的自定义分页

    一.视图CBV 1.urls url(r'^login.html$', views.Login.as_view()), 2.views from django.views import View cl ...

  2. Django学习---自定义分页

    自定义分页 简单例子: urls.py: from django.contrib import admin from django.urls import path from django.conf. ...

  3. Django框架---- 自定义分页组件

    分页的实现与使用 class Pagination(object): """ 自定义分页 """ def __init__(self,cur ...

  4. django【自定义分页】

    1. views.py def app(request): page_info = PageInfo(request.GET.get('p'), 6, 100, request.path_info, ...

  5. 7.django之自定义分页记录

    只是大概记录下步骤: 1.表结构: class UserProfile(models.Model): ''' 用户表 ''' user = models.OneToOneField(User,verb ...

  6. Django自定义分页、bottle、Flask

    一.使用django实现之定义分页 1.自定义分页在django模板语言中,通过a标签实现; 2.前段a标签使用<a href="/user_list/?page=1"> ...

  7. Django 分页组件替换自定义分页

    Django的分页器(paginator) 总之不太好用我们还是用自己的好一些 自定义分页器 分页实现源码 """ 自定义分页组件 """ ...

  8. Django框架详细介绍---cookie、session、自定义分页

    1.cookie 在HTTP协议介绍中提到,该协议是无状态的,也就是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的 ...

  9. Django(十四)分页器(paginator)及自定义分页D

    http://www.mamicode.com/info-detail-1724597.html http://www.cnblogs.com/wupeiqi/articles/5246483.htm ...

随机推荐

  1. Cannot find a valid baseurl for repo: base/7/x86_6 解决方法

    安装centos7后发现不能上网, sudo vi /etc/sysconfig/network-scripts/ifcfg-ens33 将ONBOOT=no改为ONBOOT=yes 然后重启网络服务 ...

  2. 关于python的面向对象

    一,面向对象 1..面向对象的过程:一切以事物的流程为核心,核心是过程二字,过程是指解决问题的步骤, 是一种机械是的编程思维 优点:负责的问题流程化,编写相对简单 缺点:可扩展性能差 2.面向对象一切 ...

  3. EF延迟加载和懒加载

    EF默认是延迟加载的 延迟加载就是刚开始只会读取当前实体对应表的数据 关联表的数据不会读取 只有下面条件用到了才会再去读取 所以可能会造成N次读取数据库  需要在实体的属性加virtual关键字 延迟 ...

  4. 力扣 (LeetCode)657. 机器人能否返回原点

    在二维平面上,有一个机器人从原点 (0, 0) 开始.给出它的移动顺序,判断这个机器人在完成移动后是否在 (0, 0) 处结束. 移动顺序由字符串表示.字符 move[i] 表示其第 i 次移动.机器 ...

  5. 力扣(LeetCode) 961. 重复 N 次的元素

    在大小为 2N 的数组 A 中有 N+1 个不同的元素,其中有一个元素重复了 N 次. 返回重复了 N 次的那个元素. 示例 1: 输入:[1,2,3,3] 输出:3 示例 2: 输入:[2,1,2, ...

  6. js 垃圾回收机制和引起内存泄漏的操作

    垃圾回收机制 JS中最常见的垃圾回收方式是标记清除. 工作原理:是当变量进入环境时,将这个变量标记为“进入环境”.当变量离开环境时,则将其标记为“离开环境”.标记“离开环境”的就回收内存. 工作流程: ...

  7. 《剑指offer》第五十五题(二叉树的深度)

    // 面试题55(一):二叉树的深度 // 题目:输入一棵二叉树的根结点,求该树的深度.从根结点到叶结点依次经过的 // 结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. //如果左右 ...

  8. vue-cli3+cordova实现app混合开发

    一.安装vue-cli3 安装并建新项目 二.进入项目安装cordova npm install -g cordova 下载完之后,输入 cordova -v 查看是否成功安装,出现相应的版本号则成功 ...

  9. vue 脚手架搭建新项目以及element-ui等vue组件的使用

    vue快速搭建项目(前提是你的电脑已经安装了node的环境和vue脚手架安装,不会的自行百度) 1:打开终端: 这里说下此时位置是在User下的lijuntao文件夹下面,我一般会在桌面新建一个文件夹 ...

  10. ICO分享