一、分页功能开发
前几章我们开发了首页,数据表展示页,以及数据过滤功能,这一节开发分页功能。
如果数据比较多的情况,不可能都在一页显示,所以需要开发分页功能。
二、分页功能,这里使用Django自带的分页。
1、首先了解一下Django的分页:
查看官方文档:https://docs.djangoproject.com/zh-hans/2.1/topics/pagination/
objects = ['john', 'paul', 'george', 'ringo']
p = Paginator(objects, 2) #表示把这个列表每页展示两个
p.num_pages #计算总共有多少页
type(p.page_range)
<class 'range_iterator'> #计算页码范围,可以看出p.page_range这是个迭代器,翻到哪页就显示哪页的数据
p.page_range
range(1, 3) #计算页码范围,包含第一个,不包含最后一个数字
>>> page1 = p.page(1) #实例化第一页这个对象,显示里边的值
>>> page1
<Page 1 of 2>
>>> page1.object_list
['john', 'paul']
>>> page2 = p.page(2) #实例化第二页这个对象,这对象是有判断前一页,后一页,是否有其他页这些方法的,如果没有会报错
>>> page2.object_list
['george', 'ringo']
>>> page2.has_next()
False
>>> page2.has_previous()
True
>>> page2.has_other_pages()
True
>>> page2.next_page_number()
Traceback (most recent call last):
...
EmptyPage: That page contains no results
Django官方用法实例:假如有一个合同数据表,里边有许多合同数据,给这个数据分页
视图函数:
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') #得到当前页码
contacts = paginator.get_page(page) #当前页码 对应页面显示的数据集合
return render(request, 'list.html', {'contacts': contacts})
templates用法实例:
{% 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=1">« first</a>
<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>
<a href="?page={{ contacts.paginator.num_pages }}">last »</a>
{% endif %}
</span>
</div>
2、通过以上官方文档讲解,基本可以明白,用法就是对于 一堆数据集合,给它分页,然后通过request得到当前页,然后把当前页的数据显示到当前页面上,然后使用分页的next,previous等方法,显示上一页和下一页
接下来具体开发:
修改视图函数:
在HTML上添加如下代码:
显示效果如图:
但是点击next时,会报错,原因是把页码当成了过滤查询条件:
需要作如下修改:
修改后,可以正常翻页:
3、这么显示比较简陋,给它修改一下:
还是从bootstrap上使用,比较方便:https://v3.bootcss.com/components/#pagination
我们使用这个分页,能调节按钮大小:
<nav aria-label="...">
<ul class="pagination">
<li class="disabled"><a href="#" aria-label="Previous"><span aria-hidden="true">«</span></a></li>
<li class="active"><a href="#">1 <span class="sr-only">(current)</span></a></li>
...
</ul>
</nav>
具体美化目前不是很懂,先参考一下别人写的:
tags:
html页面:
显示效果如图:
五、功能完善
1、之前只开发了设置了自定义的表的数据展示,没有添加自定义的表,点开没有数据展示,这里完善一下。
这里需要修改build_table_row,
修改后效果如图,数据显示正确,但是多了个过滤按钮:
这个按钮是前端显示的,因此在前端加一个判断:
有自定义过滤的就显示过滤,没有的就不显示
修改后显示效果如图:
2、每个表对应的应用名字,之前使用APP_NAME代替,现在给它显示出来:
由于前端不能显示下划线,因此还是通过tag返回给前端
显示效果如图:
每个表再加一个表名:
显示效果如图: