Django之自定义分页
分页功能在每个网站都是必要的,对于分页来说,其实就是根据用户的输入计算出应该显示在页面上的数据在数据库表中的起始位置。
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之自定义分页的更多相关文章
- 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 ...
- Django学习---自定义分页
自定义分页 简单例子: urls.py: from django.contrib import admin from django.urls import path from django.conf. ...
- Django框架---- 自定义分页组件
分页的实现与使用 class Pagination(object): """ 自定义分页 """ def __init__(self,cur ...
- django【自定义分页】
1. views.py def app(request): page_info = PageInfo(request.GET.get('p'), 6, 100, request.path_info, ...
- 7.django之自定义分页记录
只是大概记录下步骤: 1.表结构: class UserProfile(models.Model): ''' 用户表 ''' user = models.OneToOneField(User,verb ...
- Django自定义分页、bottle、Flask
一.使用django实现之定义分页 1.自定义分页在django模板语言中,通过a标签实现; 2.前段a标签使用<a href="/user_list/?page=1"> ...
- Django 分页组件替换自定义分页
Django的分页器(paginator) 总之不太好用我们还是用自己的好一些 自定义分页器 分页实现源码 """ 自定义分页组件 """ ...
- Django框架详细介绍---cookie、session、自定义分页
1.cookie 在HTTP协议介绍中提到,该协议是无状态的,也就是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的 ...
- Django(十四)分页器(paginator)及自定义分页D
http://www.mamicode.com/info-detail-1724597.html http://www.cnblogs.com/wupeiqi/articles/5246483.htm ...
随机推荐
- HDU 5575 Discover Water Tank(左偏树)
https://vjudge.net/problem/HDU-5575 题意: 有一个水箱,被n-1块板子分成了n个部分,板子的高度不尽相同.现在有m次探测,每次探测在第x部分的y+0.5高度处是否有 ...
- linux 进阶命令笔记(12月26日)
1. df 指令 作用:查看磁盘空间 用法: #df -h -h 表示以可读性较高的形式展示大小 2.free 指令 作用:查看内存使用情况 语法:#free -m -m表 ...
- SVN的常用功能使用教程
(一)导入项目到版本库中 1. 在SVN服务器的仓库中新建项目名称文件夹 2. 选择安装Visual SVN的本地计算机中的一个文件夹,右键选择导入,将本地项目导入到SVN服务中央仓库中 3. 输入在 ...
- SpringBoot配置Aop demo
1. Demo部分 package com.example.demo.controller; import org.springframework.web.bind.annotation.Reques ...
- Utunbu常见问题
关于Ubuntu中Could not get lock /var/lib/dpkg/lock解决方案 https://blog.csdn.net/u011596455/article/details/ ...
- stop 用法
1. stop 文档 $(selector).stop(stopAll,goToEnd) stopAll 可选.规定是否停止被选元素的所有加入队列的动画.goToEnd 可选.规定是否允许完成当前的动 ...
- 网络通信框架:Netty和Mina
参考: https://www.cnblogs.com/wrencai/p/5907042.html https://blog.csdn.net/qq_29954971/article/details ...
- Codeforces 101173 C - Convex Contour
思路: 如果所有的图形都是三角形,那么答案是2*n+1 否则轮廓肯定触到了最上面,要使轮廓线最短,那么轮廓肯定是中间一段平的 我们考虑先将轮廓线赋为2*n+2,然后删去左右两边多余的部分 如果最左边或 ...
- 第 8 章 容器网络 - 059 - 安装配置 flannel
安装配置 flannel 1) build flannel flannel 没有现成的执行文件可用,必须自己 build,最可靠的方法是在 Docker 容器中 build. 不过用于做 build ...
- BGP - 1,基本概念
1,BGP知识点 a)AS号:私有(64512-65535),公有(0-64511). b)什么时候使用BGP:有数据穿越本AS前往其他AS:本AS有多条到其他AS的连接:必须要做策略. c)BG ...