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 ...
随机推荐
- 剑指Offer-第一章面试细节总结
面试细节:行为面试(20%)+技术面试(70%)+应聘者提问(10%) * 行为面试:跳槽者(不要抱怨老板,不要抱怨同事,只为追寻自己的理想而站斗) * 技术面试:1.基础知识点(编程语言,数据结构( ...
- Instruments检测解决内存泄露以及进行性能测试
1.启动Xcode自带的Instruments.这里有两种方法启动. 方法一: 方法二: 2.选择Leaks选项.(该选项用来进行内存泄漏检测) 说明: Leaks:找到引发内存泄漏的起点. Time ...
- BZOJ4832: [Lydsy2017年4月月赛]抵制克苏恩
传送门 题目大意: 攻击k次,每次可攻击随从或英雄. 随从数不大于7个,且1滴血的a个,2滴b个,3滴c个. 攻击一次血-1,如果随从没死可以生成3滴血随从一个 题解: 概率/期望dp f[i][j] ...
- 洛谷 P1561 [USACO12JAN]爬山Mountain Climbing
传送门 题目大意: n头牛,上山时间为u(i),下山为d(i). 要求每一时刻最多只有一头牛上山,一头牛下山. 问每头牛都上下山后花费最少时间. 题解:贪心 推了推样例,发现上山时间一定,那找个下山最 ...
- Dawn 阿里开源前端开发构建工具
Dawn 取「黎明.破晓」之意,原为「阿里云·业务运营团队」内部的前端构建和工程化工具,现已完全开源.它通过pipeline 和 middleware 将开发过程抽象为相对固定的阶段和有限的操作,简化 ...
- next.js 简单使用
1. 介绍 一个react.js 服务器端渲染开源项目(不只是服务器端渲染,直接也可以生成纯静态站点) 类似的解决方案有好多,比如react.js 自身的服务器渲染方案(但是使用起来就是比较怪异) g ...
- openfaas 架构介绍
此为官方介绍 Overview of OpenFaaS Function Watchdog You can make any Docker image into a serverless fun ...
- java的内存管理 对象的分配与释放
分配 程序员通过new为每个对象申请内存空间(基本类型除外),所有对象都在堆中分配空间:释放:对象的释放是由垃圾回收机制决定和执行的. Java内存分为两种:栈内存和堆内存 (1)在函数中定义的基本类 ...
- oracle驱动包maven下载失败解决
oracle是付费的,因此jar包也不是随便让人下的,这就给maven的下载和编译带来了麻烦,因为我们没法从maven仓库直接拿来用.解决办法就是先从别的地方获取jar包,再放到本地仓库里去,这样运行 ...
- selenium新的定位方法,更简洁很方便
亲测是可以的 self.driver.find_element('id','kw').send_keys(u"凯宾斯基")