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

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. Go 字典(Map)

    比较熟悉 Python 的对于字典肯定不会陌生,在 Go 中 map 就是 Python 中字典的概念,它的基本格式是 map[keyType]valueType .map 的读取和设置和 slice ...

  2. Linux shell 计算两个文件的并集、交集、差集

    假设我们现在有两个文件 a.txt .b.txt a.txt 中的内容如下: a c 1 3 d 4 b.txt 中的内容如下: a b e 2 1 5 # Example 01 计算并集: [roo ...

  3. 使用axios实现上传视频进度条

    这是最终的效果图 先介绍一下axios的使用:中文的axios官方介绍 首先定义一个uploadTest方法,写在vue文件的methods里 该方法有三个参数,分别是参数,和两个回调函数,参数就是我 ...

  4. 【Java】【事件处理机制】

    import javax.swing.*;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.Actio ...

  5. git项目,VSCode显示不同颜色块的含义

    一. 概念 代码里的左侧颜色标识: 红色,未加入版本控制; (刚clone到本地) 绿色,已经加入版本控制暂未提交; (新增部分) 蓝色,加入版本控制,已提交,有改动: (修改部分) 白色,加入版本控 ...

  6. ngui项目花屏问题

    项目用的ngui 最近在金立手机上遇到一个问题就是  启动的时候会花一下屏幕 一闪而过  由于ngui默认camera使用的是clear depth  所以按照网上的办法修改 color 跟skybo ...

  7. 【三十二】thinkphp之连接数据库、实例化模型

    1.连接数据库 Thinlphp内置了抽象数据库访问层,把不同的数据操作封装起来.我们只需要调用公共的DB类进行操作即可.DB类会自动调用相应的数据库驱动来处理. 在应用目录/common/conf/ ...

  8. 如何将SqlServer中表结构以及表数据全部导出

    不记录,很快就忘记了:记录了,仿佛也记得更牢了 步骤如下: Step1:右击数据库,弹出的标签中选择Tasks---Generate Scripts... Step2: 弹出新窗口中,勾选" ...

  9. CentOS6.5下搭建ftp服务器(三种认证模式:匿名用户、本地用户、虚拟用户)

    CentOS 6.5下搭建ftp服务器 vsftpd(very secure ftp daemon,非常安全的FTP守护进程)是一款运行在Linux操作系统上的FTP服务程序,不仅完全开源而且免费,此 ...

  10. Python 增强类库

    程序中断 # coding=utf-8 支持中文 re = iter(range(5)) try: for i in range(100): print re.next() except StopIt ...