Django 分页 以及自定义分页
Django提供了一个新的类来帮助你管理分页数据,这个类存放在django/core/paginator.py
.它可以接收列表、元组或其它可迭代的对象。
基本语法
1
2
3
4
5
6
7
8
9
10
|
class Paginator( object ): def __init__(self, object_list, per_page, orphans=0, allow_empty_first_page=True): self.object_list = object_list self.per_page = int (per_page) self.orphans = int (orphans) self.allow_empty_first_page = allow_empty_first_page …… |
基本语法实例
from django.core.paginator import Paginator
objects = ['john','paul','george','ringo','lucy','meiry','checy','wind','flow','rain']
p = Paginator(objects,) # 3条数据为一页,实例化分页对象
print(p.count) # 对象总共10个元素
print(p.num_pages) # 对象可分4页
print(p.page_range) # xrange(, ) 对象页的可迭代范围 page1 = p.page() # 取对象的第一分页对象
print(page1.object_list) # 第一分页对象的元素列表['john', 'paul', 'george']
print(page1.number) # 第一分页对象的当前页值 page2 = p.page() # 取对象的第二分页对象
print(page2.object_list) # 第二分页对象的元素列表 ['ringo', 'lucy', 'meiry']
print(page2.number) # 第二分页对象的当前页码值 print(page1.has_previous()) # 第一分页对象是否有前一页 False
print(page1.has_other_pages()) # 第一分页对象是否有其它页 True print(page2.has_previous()) # 第二分页对象是否有前一页 True
print(page2.has_next()) # 第二分页对象是否有下一页 True
print(page2.next_page_number()) # 第二分页对象下一页码的值
print(page2.previous_page_number()) # 第二分页对象的上一页码值
print(page2.start_index()) # 第二分页对象的元素开始索引
print(page2.end_index()) # 第2分页对象的元素结束索引
官方解释
在视图中的应用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from django.shortcuts import render def listing(request): contact_list = Contacts.objects.all() paginator = Paginator(contact_list, 25) # Show 25 contacts per page page = request.GET. get ( 'page' ) try : contacts = paginator.page(page) except PageNotAnInteger: # If page is not an integer, deliver first page. contacts = paginator.page(1) except EmptyPage: # If page is out of range (e.g. 9999), deliver last page of results. contacts = paginator.page(paginator.num_pages) return render(request, 'list.html' , { 'contacts' : contacts}) |
在template的html模板中的应用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
{% for contact in contacts %} {# Each "contact" is a Contact model object . #} {{ contact.full_name|upper }}<br /> ... {% endfor %} <div class = "pagination" > <span class = "step-links" > {% if contacts.has_previous %} <a href= "?page={{ contacts.previous_page_number }}" >previous</a> {% endif %} <span class = "current" > Page {{ contacts.number }} of {{ contacts.paginator.num_pages }}. </span> {% if contacts.has_next %} <a href= "?page={{ contacts.next_page_number }}" >next</a> {% endif %} </span> </div> |
分割线。。。。。
回归到easyadmin项目中,我们来定制自己的分页功能,当然数据的获取我们依旧通过对象来提取,但是难点在于href属性,我们要如何构造url是关键,因为我们的分页功能是在过滤功能的基础上,因此不能简单的使用?page=%s 格式,而且为了能得到更好的体验也迫使我们不得不重写分页功能
首先看下视图函数吧
def display_table_objs(request,app_name,table_name):
admin_class = easy_admin.enabled_admins[app_name][table_name]
object_list,filter_condtions = table_filter(request, admin_class)
paginator = Paginator(object_list, admin_class.list_per_page) # Show contacts per page
print(request.get_full_path())
page = request.GET.get('page')
try:
object_list=paginator.page(page)
except PageNotAnInteger:
object_list=paginator.page()
except EmptyPage:
object_list=paginator.page(paginator.num_pages)
return render(request,'easyadmin/display_table.html',{"admin_class":admin_class,"filter_condtions":filter_condtions,'object_list':object_list})
基本没有改动 接下来看下自定义标签
@register.simple_tag()
def easypaginator(request,object_list):
"""now_page:当前页
show_page:需要显示多少页
num_pages:总共有多少页
"""
now_page=object_list.number
show_page=
num_pages=object_list.paginator.num_pages
base_url=""
for k,v in request.GET.items():
if k=='page':
continue
if v:
base_url+="&%s=%s" %(k,v)
if num_pages <= show_page:
"""如果总页数小于需要展示的页数 那么久把所有的页码都打出来吧"""
start_page=
end_page=num_pages
else:
start_page = now_page - (show_page - ) /
end_page = now_page + (show_page - ) /
if start_page <= :
start_page =
end_page = start_page + show_page -
if end_page >= num_pages:
end_page = num_pages
start_page = num_pages - show_page +
str_list = []
if now_page == :
prevpage = '<li class="disabled"><a>上一页</a></li>'
else:
active_url="?page=%s" % str(now_page-)
prevpage = '<li><a href=%s>上一页</a></li>' %(active_url+base_url)
if now_page == num_pages:
lastpage = '<li class="disabled" ><a href="#">下一页</a></li>'
else:
active_url = "?page=%s" % str(now_page + )
lastpage='<li><a class="" href=%s>下一页</a></li>' %(active_url+base_url)
str_list.append(prevpage)
for i in range(int(start_page), int(end_page + )):
if i == now_page:
active_url = "?page=%s" % str(i)
tmp = '<li class="active" ><a href=%s >%s</a></li>' %(active_url+base_url,str(i))
else:
active_url = "?page=%s" % str(i)
tmp = '<li class="" ><a href=%s >%s</a></li>' % (active_url + base_url, str(i))
str_list.append(tmp)
str_list.append(lastpage)
omit='<li class="" ><a>....</a></li>'
if num_pages > show_page:
str_list.insert(int(len(str_list)/),omit)
str_list = mark_safe("".join(str_list))
return str_list
我们接受两个对象,一个request,一个是object_list也就是数据。那么我们可以获得哪些数据呢?总共的页数,当前页数,以及params,同时我们也可以设置需要显示多少页的内容,而不是显示100页或者更多,这样更符合人们的需求,这个值的改变不是很多我们就直接写在函数中,而不考虑写在baseadmin类中。通过params我们可以拼接url,通过当前页我们可以确定标签的样式,当然这都是基于bootsharp插件,当然如果不用bootsharp对分页功能完全不影响。
<nav class="page pagination">
<ul class="pagination">
{% easypaginator request object_list %}
</ul>
</nav>
效果:
Django 分页 以及自定义分页的更多相关文章
- 第三百一十四节,Django框架,自定义分页
第三百一十四节,Django框架,自定义分页 自定义分页模块 #!/usr/bin/env python #coding:utf-8 from django.utils.safestring impo ...
- python/Djangof分页与自定义分页
python/Djangof分页与自定义分页 Django分页 ##============================================分页==================== ...
- python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页)
一.ajax登录示例 新建项目login_ajax 修改urls.py,增加路径 from app01 import views urlpatterns = [ path('admin/', admi ...
- 十二 Django框架,自定义分页
自定义分页模块 #!/usr/bin/env python #coding:utf-8 from django.utils.safestring import mark_safe #封装分页类模块 c ...
- django cookie session 自定义分页
cookie cookie的由来 http协议是无状态的,犹如人生若只如初见,每次都是初次.由此我们需要cookie来保持状态,保持客户端和服务端的数据通信. 什么是cookie Cookie具体指的 ...
- Djang内置分页和自定义分页
内置分页 views from django.core.paginator import Paginator,Page,PageNotAnInteger def DJs_pages(request): ...
- MVC下分页的自定义分页一种实现
1.引言 在MVC开发中我们经常会对数据进行分页的展示.通过分页我们可以从服务端获取指定的数据来进行展示.这样既节约了数据库查询的时间也节约了网络传输的数据量.在MVC开发中使用的比较多的应该是MVC ...
- Django 中的自定义分页标签
目录结构: 1.在应用下,migrations的同级目录创建templatetags目录(主要两个文件,包含__init__.py) 2.创建分页标签(pagetag.py) #!/usr/bin/e ...
- Django学习手册 - 自定义分页函数
前端代码: <div class="xianshi"> {% for i in info %} <ul> <li>{{ i }}</li& ...
随机推荐
- 理解学习Springboot(一)
Springboot有何优势呢,网上一大推,这里就不写了. 一.配置maven 1.在maven官网下载maven,http://maven.apache.org/download.cgi 2.将下载 ...
- 美国末日AI System设计分享
引言 好久没有写博客了,这半年在游戏公司工作,过得比较充实,每天不是add feature就是debug,所以忽视了写博客.今天发一篇关于AI博客. 主要是最近看了一些关于"The Last ...
- 用Python实现检测视频真伪?
译者注:本文以一段自打24小时耳光的视频为例子,介绍了如何利用均值哈希算法来检查重复视频帧.以下是译文. 有人在网上上传了一段视频,他打了自己24个小时的耳光.他真的这么做了吗?看都不用看,肯定没有! ...
- HTTP协议请求信息详解
通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机的响应消息.客户端向服务器发送一个请求,请求头包含请求的方法.URI.协议版本.以及包含请求修饰符.客户信息和内容的类似于MIME的消息结构 ...
- 廖雪峰git笔记
查看本地机子的在Git上的名字和邮箱:git config user.namegit config user.email 对所有仓库指定相同的用户名和Email地址:git config --glob ...
- 从武侠中的兵器看待数据访问工具——Hibernate Spring.Data Mybatis
<泪痕剑>第31集,卓爷大谈自己的兵器,我从中摘录,觉得非常受用. “你错了,我们和武器之间的关系,就好像选择情人一样,不管是否擅长,都要用感情. 我少年时候用刀,青年时候仍用刀,不知道用 ...
- AngularJS - 路由 routing 基础示例
AngularJS 路由 routing 能够从页面的一个视图跳转到另外一个视图,对单页面应用来讲是至关重要的.当应用变得越来越复杂时,我们需要一个合理的方式来管理用户在使用过程中看到的界面.Angu ...
- 2018-2019-20172329 《Java软件结构与数据结构》第四周学习总结
2018-2019-20172329 <Java软件结构与数据结构>第四周学习总结 经过这样一个国庆节的假期,心中只有一个想法,这个国庆假期放的,不如不放呢!! 教材学习内容总结 < ...
- HDU 5496 Beauty of Sequence
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5496 Beauty of Sequence Problem Description Sequence ...
- gmssl
一.安装 1.1 github地址 1.2 官网地址 由于我本地虚拟机跑的是centos,按照官网的安装步骤,没有安装成功.后来使用github上提供的安装步骤完美编译安装成功. 二.使用 由于gms ...