Django框架 之 Pagination分页实现
Django框架 之 Pagination分页实现
浏览目录
自定义分页
Django内置分页
一、自定义分页
1、基础版自定义分页
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
data = [] for i in range ( 1 , 302 ): tmp = { "id" : i, "name" : "alex-{}" . format (i)} data.append(tmp) print (data) def user_list(request): # user_list = data[0:10] # user_list = data[10:20] try : current_page = int (request.GET.get( "page" )) except Exception as e: current_page = 1 per_page = 10 # 数据总条数 total_count = len (data) # 总页码 total_page, more = divmod (total_count, per_page) if more: total_page + = 1 # 页面最多显示多少个页码 max_show = 11 half_show = int ((max_show - 1 ) / 2 ) if current_page < = half_show: show_start = 1 show_end = max_show else : if current_page + half_show > = total_page: show_start = total_page - max_show show_end = total_page else : show_start = current_page - half_show show_end = current_page + half_show # 数据库中获取数据 data_start = (current_page - 1 ) * per_page data_end = current_page * per_page user_list = data[data_start:data_end] # 生成页面上显示的页码 page_html_list = [] # 加首页 first_li = '<li><a href="/user_list/?page=1">首页</a></li>' page_html_list.append(first_li) # 加上一页 if current_page = = 1 : prev_li = '<li><a href="#">上一页</a></li>' else : prev_li = '<li><a href="/user_list/?page={}">上一页</a></li>' . format (current_page - 1 ) page_html_list.append(prev_li) for i in range (show_start, show_end + 1 ): if i = = current_page: li_tag = '<li class="active"><a href="/user_list/?page={0}">{0}</a></li>' . format (i) else : li_tag = '<li><a href="/user_list/?page={0}">{0}</a></li>' . format (i) page_html_list.append(li_tag) # 加下一页 if current_page = = total_page: next_li = '<li><a href="#">下一页</a></li>' else : next_li = '<li><a href="/user_list/?page={}">下一页</a></li>' . format (current_page + 1 ) page_html_list.append(next_li) # 加尾页 page_end_li = '<li><a href="/user_list/?page={}">尾页</a></li>' . format (total_page) page_html_list.append(page_end_li) page_html = "".join(page_html_list) return render(request, "user_list.html" , { "user_list" : user_list, "page_html" : page_html}) |
2、封装保存版
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
class Pagination( object ): def __init__( self , current_page, total_count, base_url, per_page = 10 , max_show = 11 ): """ :param current_page: 当前页 :param total_count: 数据库中数据总数 :param per_page: 每页显示多少条数据 :param max_show: 最多显示多少页 """ try : current_page = int (current_page) except Exception as e: current_page = 1 self .current_page = current_page self .total_count = total_count self .base_url = base_url self .per_page = per_page self .max_show = max_show # 总页码 total_page, more = divmod (total_count, per_page) if more: total_page + = 1 half_show = int ((max_show - 1 ) / 2 ) self .half_show = half_show self .total_page = total_page @property def start( self ): return ( self .current_page - 1 ) * self .per_page @property def end( self ): return self .current_page * self .per_page def page_html( self ): if self .current_page < = self .half_show: show_start = 1 show_end = self .max_show else : if self .current_page + self .half_show > = self .total_page: show_start = self .total_page - self .max_show show_end = self .total_page else : show_start = self .current_page - self .half_show show_end = self .current_page + self .half_show # 生成页面上显示的页码 page_html_list = [] # 加首页 first_li = '<li><a href="{}?page=1">首页</a></li>' . format ( self .base_url) page_html_list.append(first_li) # 加上一页 if self .current_page = = 1 : prev_li = '<li><a href="#">上一页</a></li>' else : prev_li = '<li><a href="{0}?page={1}">上一页</a></li>' . format ( self .base_url, self .current_page - 1 ) page_html_list.append(prev_li) for i in range (show_start, show_end + 1 ): if i = = self .current_page: li_tag = '<li class="active"><a href="{0}?page={1}">{1}</a></li>' . format ( self .base_url, i) else : li_tag = '<li><a href="{0}?page={1}">{1}</a></li>' . format ( self .base_url, i) page_html_list.append(li_tag) # 加下一页 if self .current_page = = self .total_page: next_li = '<li><a href="#">下一页</a></li>' else : next_li = '<li><a href="{0}?page={1}">下一页</a></li>' . format ( self .base_url, self .current_page + 1 ) page_html_list.append(next_li) # 加尾页 page_end_li = '<li><a href="{0}?page={1}">尾页</a></li>' . format ( self .base_url, self .total_page) page_html_list.append(page_end_li) return "".join(page_html_list) |
3、封装保存版使用指南
1
2
3
4
5
|
def user_list(request): pager = Pagination(request.GET.get( "page" ), len (data), request.path_info) user_list = data[pager.start:pager.end] page_html = pager.page_html() return render(request, "user_list.html" , { "user_list" : user_list, "page_html" : page_html}) |
二、Django内置分页
1、内置分页view部分
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
from django.shortcuts import render from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger L = [] for i in range ( 999 ): L.append(i) def index(request): current_page = request.GET.get( 'p' ) paginator = Paginator(L, 10 ) # per_page: 每页显示条目数量 # count: 数据总个数 # num_pages:总页数 # page_range:总页数的索引范围,如: (1,10),(1,200) # page: page对象 try : posts = paginator.page(current_page) # has_next 是否有下一页 # next_page_number 下一页页码 # has_previous 是否有上一页 # previous_page_number 上一页页码 # object_list 分页之后的数据列表 # number 当前页 # paginator paginator对象 except PageNotAnInteger: posts = paginator.page( 1 ) except EmptyPage: posts = paginator.page(paginator.num_pages) return render(request, 'index.html' , { 'posts' : posts}) |
2、内置分页HTML部分
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
<!DOCTYPE html> <html> <head lang = "en" > <meta charset = "UTF-8" > <title>< / title> < / head> <body> <ul> { % for item in posts % } <li>{{ item }}< / li> { % endfor % } < / ul> <div class = "pagination" > <span class = "step-links" > { % if posts.has_previous % } <a href = "?p={{ posts.previous_page_number }}" >Previous< / a> { % endif % } <span class = "current" > Page {{ posts.number }} of {{ posts.paginator.num_pages }}. < / span> { % if posts.has_next % } <a href = "?p={{ posts.next_page_number }}" > Next < / a> { % endif % } < / span> < / div> < / body> < / html> |
Django框架 之 Pagination分页实现的更多相关文章
- 第三百一十四节,Django框架,自定义分页
第三百一十四节,Django框架,自定义分页 自定义分页模块 #!/usr/bin/env python #coding:utf-8 from django.utils.safestring impo ...
- 手把手教你使用Vue/React/Angular三大框架开发Pagination分页组件
DevUI是一支兼具设计视角和工程视角的团队,服务于华为云DevCloud平台和华为内部数个中后台系统,服务于设计师和前端工程师.官方网站:devui.designNg组件库:ng-devui(欢迎S ...
- 十二 Django框架,自定义分页
自定义分页模块 #!/usr/bin/env python #coding:utf-8 from django.utils.safestring import mark_safe #封装分页类模块 c ...
- Django框架之自定义分页
分页功能在每个网站都是必要的,对于分页来说,其实就是根据用户的输入计算出应该在数据库表中的起始位置. 1.设定每页显示数据条数 2.用户输入页码(第一页.第二页...) 3.根据设定的每页显示条数和当 ...
- Django框架下的增强分页组件
本文通过文章同步功能推送至博客园,显示排版可能会有所错误,请见谅! 描述:Django框架内置了分页功能,但其只能满足简单需求,难以实现复杂功能. 实现代码: #!/usr/bin/env pytho ...
- [Python] Django框架入门5——静态文件、中间件、上传图片和分页
说明: 本文主要描述Django其他的内容,涉及静态文件处理.中间件.上传文件.分页等. 开发环境:win10.Python3.5.Django1.10. 一.静态文件处理 在Django项目的静态文 ...
- python 学习笔记十八 django深入学习三 分页,自定义标签,权限机制
django Pagination(分页) django 自带的分页功能非常强大,我们来看一个简单的练习示例: #导入Paginator>>> from django.core.p ...
- Django框架全面讲解
Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...
- python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页)
一.ajax登录示例 新建项目login_ajax 修改urls.py,增加路径 from app01 import views urlpatterns = [ path('admin/', admi ...
随机推荐
- 转载FPGA学习之内嵌乘法器调用
补充一点,除法的时候如果直接a/b那么就会调用lpm模块,不管输入是否是常数,乘法的时候输入都是reg型变量会调用硬件乘法器,有一个是常数就会调用lpm模块. 上课的时候一直听老师说真正实践的时候你别 ...
- JAMstack 技术要点
1. 简要说明 Modern web development architecture based on client-side JavaScript, reusable APIs,and preb ...
- PUTTY学习
参考地址:http://blog.csdn.net/eastmount/article/details/52753135 putty介绍: PuTTY是一个Telnet.SSH.rlogin.纯TCP ...
- linux下PS1命令提示符设置
linux下PS1命令提示符设置 在此文件最后一行添加:vim /etc/profileexport PS1='[\u@\h \W]\$ ' #这里必须用单引号. \d :代表日期,格式为 ...
- 大数据竞赛平台——Kaggle 入门篇
这篇文章适合那些刚接触Kaggle.想尽快熟悉Kaggle并且独立完成一个竞赛项目的网友,对于已经在Kaggle上参赛过的网友来说,大可不必耗费时间阅读本文.本文分为两部分介绍Kaggle,第一部分简 ...
- php排序集合
如果你已经使用了一段时间PHP的话,那么,你应该已经对它的数组比较熟悉了——这种数据结构允许你在单个变量中存储多个值,并且可以把它们作为一个集合进行操作. 经常,开发人员发现在PHP中使用这种数据结构 ...
- hibernate中dialect的讲解
RDBMS方言 DB2 org.hibernate.dialect.DB2Dialect DB2 AS/400 org.hibernate.dialect.DB2400Dialect DB2 OS39 ...
- Rest之路 - 搭建开发环境
准备Jersey框架和类库 从官网 (https://jersey.java.net/download.html) 下载最新的zip文件,解压后如下图: lib: 包含Jersey的所有类库. ext ...
- zabbix短信监控
[ ] zabbix-短信报警(参考http://hanyun.blog.51cto.com/1060170/1604918 ) [ ] zabbix-电话报警(参考http://dl528888.b ...
- 虚拟机如何设置外网ip
实例: 在数据中心机房的一台服务器上安装虚拟机,并在该虚拟机上安装一个操作系统.给该虚拟机配置公网IP,让外网能直接访问到该虚拟上的应用. 这个问题最初觉得简单,不就是桥接嘛,要只让其上网NAT就可以 ...