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 ...
随机推荐
- 1. Mysql在java中的使用步骤
-1.配置数据库:http://www.cnblogs.com/sshoub/p/4321640.html 2.创建可以远程的登录用户:http://www.cnblogs.com/xyzdw/arc ...
- Codeforces Round #420 (Div. 2) E. Okabe and El Psy Kongroo 矩阵快速幂优化dp
E. Okabe and El Psy Kongroo time limit per test 2 seconds memory limit per test 256 megabytes input ...
- 关于spring boot启动监控端点的方法(spring-boot-starter-actuator)
前言: 在spring boot的旧版本中,监控端点(如/env)是默认开启的,所以只要项目正常启动,就能通过url获取信息.可是在2.0版本以后,由于安全性考虑,除了/health和/info的端点 ...
- NativeWindow_01_CreateWindow(Ex)_VC6
1. #include <windows.h> LRESULT CALLBACK ProcWindow(HWND hwnd, UINT uMsg, WPARAM wParam, LPARA ...
- 力扣(LeetCode) 905. 按奇偶排序数组
给定一个非负整数数组 A,返回一个由 A 的所有偶数元素组成的数组,后面跟 A 的所有奇数元素. 你可以返回满足此条件的任何数组作为答案. 示例: 输入:[3,1,2,4] 输出:[2,4,3,1] ...
- 力扣 报错 runtime error: load of null pointer of type 'const int'
runtime error: load of null pointer of type 'const int' 要求返回的是int* 解决方案 1.指针使用malloc分配空间 用 int * p = ...
- js数组,字符串,json互相转换函数有哪些
js数组,字符串,json互相转换函数有哪些 一.总结 一句话总结: JSON.stringify(arr) JSON.parse(jsonString) str.split('') array.jo ...
- (转+整理)C#中使用GUID
GUID(全局统一标识符)是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的.通常平台会提供生成GUID的API.生成算法很有意思,用到了以太网卡地址.纳秒级时间.芯片ID码和许多可 ...
- 雷林鹏分享:jQuery EasyUI 树形菜单 - 创建异步树形菜单
jQuery EasyUI 树形菜单 - 创建异步树形菜单 为了创建异步的树形菜单(Tree),每一个树节点必须要有一个 'id' 属性,这个将提交回服务器去检索子节点数据. 创建树形菜单(Tree) ...
- 基于Struts2框架的文件下载 --- Struts2
一.Struts2指定类型文件的下载 1.最终功能实现的截图:(点击文件下载链接,下载文件 ) 2.核心代码 index.jsp: <%@ page language="java&qu ...