本文实例讲述了django框架实现分页显示内容的方法。分享给大家供大家参考,具体如下:
分页
1、作用
数据加载优化
2、前端引入bootstrap样式:
1
2
|
{ # 引入bootstrap样式的cdn资源 #} <link href = "https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel = "external nofollow" rel = "stylesheet" > |
引入分页器:
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
|
<div id = "rootbox" > <h1>文章列表< / h1> <ul id = "bloglist" > { # 遍历博文 #} { % for blog in page.object_list % } { # 显示博文标题 #} <li> <a href = "{% url 'app:readblog' blog.id %}" rel = "external nofollow" ><h3>{{ blog.title }}< / h3>< / a> < / li> { % endfor % } < / ul> { #分页器:html内容拷贝于bootstrap网站-组件-分页#} { # bootstrap是一整套成熟经典的页面组件框架 #} <nav aria - label = "page navigation" > <ul class = "pagination" > { # 上一页按钮 #} { # 如果有上一页 #} { % if page.has_previous % } <li> { # 点击超链接,对上一页的页面发起访问 #} <a href = "{% url 'app:blogs' page.previous_page_number %}" rel = "external nofollow" aria - label = "previous" > <span aria - hidden = "true" >«< / span> < / a> < / li> { # 如果没有上一页 #} { % else % } { # 当没有上一页时,阅读bootrap文档得知,对当前li使用disabled样式 #} <li class = "disabled" > { # href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" ,处于禁用状态的按钮被点击时直接跳转本页 #} <a href = "#" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" aria - label = "previous" > <span aria - hidden = "true" >«< / span> < / a> < / li> { % endif % } { # 页码按钮 #} { # 遍历传入的页码范围 #} { % for p in pagerange % } { # 如果页码=当前页页码 #} { % ifequal p currentpage % } { # 被选中的页码具有高亮效果,阅读bootrap文档得知,对当前li使用active样式 #} { # {% url 'app:blogs' p %} 点击页码,对第p页的路由发起访问 #} <li class = "active" ><a href = "{% url 'app:blogs' p %}" rel = "external nofollow" rel = "external nofollow" >{{ p }}< / a>< / li> { % else % } { # 非当前页页码普通显示 #} <li><a href = "{% url 'app:blogs' p %}" rel = "external nofollow" rel = "external nofollow" >{{ p }}< / a>< / li> { % endifequal % } { % endfor % } { # 下一页按钮 #} { % if page.has_next % } <li> { # 点击超链接,对下一页的页面发起访问 #} <a href = "{% url 'app:blogs' page.next_page_number %}" rel = "external nofollow" aria - label = "next" > <span aria - hidden = "true" >»< / span> < / a>< / li> { % else % } { # 当没有下一页时,阅读bootrap文档得知,对当前li使用disabled样式 #} <li class = "disabled" > { # href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" ,处于禁用状态的按钮被点击时直接跳转本页 #} <a href = "#" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" aria - label = "next" > <span aria - hidden = "true" >»< / span> < / a>< / li> { % endif % } < / ul> < / nav> < / div> |
3、paginator
- 数据分页工具
-
对象创建
- paginator(数据集,每一页数据数)
-
属性
- count:对象总数
- page_range:页码列表,从1开始
- num_pages:页面总数
-
方法
- page(整数): 获得一个page对象
-
常见错误
- invalidpage:page()传递无效页码
- pagenotaninteger:page()传递的不是整数
- empty:page()传递的值有效,但是没有数据
4、page
- 具体的某一页面
- 对象获得,通过paginator的page()方法获得
-
属性
- object_list:当前页面上所有的数据对象
- number:当前页的页码值
- paginator: 当前page关联的paginator对象
-
方法
- has_next():判断是否有下一页
- has_previous():判断是否有上一页
- has_other_pages():判断是否有上一页或下一页
- next_page_number():返回下一页的页码
- previous_page_number():返回上一页的页码
- len():返回当前页的数据的个数
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
|
# 显示博文列表 # pagenum=路由参数=用户想要查看第几页 def showblogs(request, pagenum): # 查询数据库获取所有博文 blogs = blog.objects. all () # 构建分页器对象,blogs=所有博文,2=每页显示的个数 paginator = paginator(blogs, 2 ) # 获取第n页的页面对象 page = paginator.page(pagenum) # paginator和page的常用api # page.previous_page_number() # page.next_page_number() # page.has_previous() # page.has_next() # 构造页面渲染的数据 ''' 渲染需要的数据: - 当前页的博文对象列表 - 分页页码范围 - 当前页的页码 ''' data = { # 当前页的博文对象列表 'page' : page, # 分页页码范围 'pagerange' : paginator.page_range, # 当前页的页码 'currentpage' : page.number, } # 将数据丢给页面渲染 return render(request, 'blogs.html' , context = data) |
希望本文所述对大家基于django框架的python程序设计有所帮助。
原文链接:https://blog.csdn.net/lm_is_dc/article/details/80528010