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 ...
随机推荐
- 51nod 1055 最长等差数列
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1055 题意: 思路:先固定一个位置,然后从该中心点出发向两边扫,确实很难 ...
- 【Django】【环境配置】Mac
mysql环境配置:http://www.cnblogs.com/chenmo-xpw/p/6102933.html
- P1948 [USACO08JAN]电话线Telephone Lines
传送门 思路: 二分+最短路径:可以将长度小于等于 mid 的边视为长度为 0 的边,大于 mid 的边视为长度为 1 的边,最后用 dijkstra 检查 d [ n ] 是否小于等于 k 即可. ...
- idea中git pull push需要反复输入密码
在使用idea开发的过程中,在终端terminal中git pull和git push时遇到一个问题,一个是 每次提交都需要输入用户名和密码,,从网上找了下解决方案,记录一下. 解决: 打开git终端 ...
- Selenium IDE使用
基于版本Selenium IDE 3.2.2(注:该工具不常用,可以使用定位元素是否存在) Selenium IDE可以录制也很方便,当然录下来的经常回放不成功,需要自己调试就是了.它是只针对Web页 ...
- JDK10 新特性
关于至此,我从大一下学习,以及大二上的巩固,这应该是SE部分的最后一章节内容,介绍一下jdk10的新特性 jdk在更新10之后,出现很多新特性,根据我所观看的视频,主要提及以下几点新特性 1.新增va ...
- Java学习必备书籍推荐终极版!
Java 基础 <Head First Java>(推荐,豆瓣评分 8.7,1.0K+人评价): 可以说是我的 Java 启蒙书籍了,特别适合新手读当然也适合我们用来温故 Java 知识点 ...
- Cordova 混合开发
详细的教程在以下博客 https://blog.csdn.net/csdn100861/article/details/78585333
- js几个小技巧和坑
蝴蝶书看了,也知道充满了毒瘤和糟粕,但该用还是得用. 实际写了几天,小技巧记录下来.都是在py里有直接答案,不会遇到的问题,没想到js里这么费事. 还是要多读<ES6标准入门> 1判断ob ...
- traceback模块——获取详细的异常信息
try: 1/0 except Exception,e: print e 输出结果是integer division or modulo by zero,只知道是报了这个错,但是却不知道在哪个文件哪个 ...