十三.通过pagination对页面进行分页
2016-06-14 21:19
381 查看
如果表格数据量过多,需要对表格进行分页处理。而Django自带了分页机制,具体可以参见https://docs.djangoproject.com/en/1.9/topics/pagination/
在view中,我们创建一个分页函数pagination,并单独建立一个分页机制的文件,以供所有表格分页时使用。
1.在views中建立pagination函数,用于分页。为了测试方便,我们每页仅显示2条记录。
Views.py:
#分页函数
def pagination(request, queryset, display_amount=2, after_range_num = 5,before_range_num = 4):
#按参数分页
try:
#从提交来的页面获得page的值
page = int(request.GET.get("page", 1))
#如果page值小于1,那么默认为第一页
if page < 1:
page = 1
#若报异常,则page为第一页
except ValueError:
page = 1
#引用Paginator类
paginator = Paginator(queryset, display_amount)
#总计的数据条目
count = paginator.count
#合计页数
num_pages = paginator.num_pages
try:
#尝试获得分页列表
objects = paginator.page(page)
#如果页数不存在
except EmptyPage:
#获得最后一页
objects = paginator.page(paginator.num_pages)
#如果不是一个整数
except PageNotAnInteger:
#获得第一页
objects = paginator.page(1)
#根据参数配置导航显示范围
temp_range = paginator.page_range
#如果页面很小
if (page - before_range_num) <= 0:
#如果总页面比after_range_num大,那么显示到after_range_num
if temp_range[-1] > after_range_num:
page_range = xrange(1, after_range_num+1)
#否则显示当前页
else:
page_range = xrange(1, temp_range[-1]+1)
#如果页面比较大
elif (page + after_range_num) > temp_range[-1]:
#显示到最大页
page_range = xrange(page-before_range_num,temp_range[-1]+1)
#否则在before_range_num和after_range_num之间显示
else:
page_range = xrange(page-before_range_num+1, page+after_range_num)
#返回分页相关参数
return objects, page_range, count, num_pages
2.
在之前的列表函数中,调用pagination函数,从而对具体的data数据来进行分页处理:
def lists(request, table):
…
#将分页的信息传递到展示页面中去
data_list, page_range, count, page_nums = pagination(request, data)
#建立context字典,将值传递到相应页面
context = {
'data': data_list,
'table': table,
'page_range': page_range,
'count': count,
'page_nums': page_nums,
'sub_title': sub_title,
}
#跳转到相应页面,并将值传递过去
return render(request,list_template,context)
3.建立单独的html,存放pagination的显示内容。
Pagination.html:
<pre class="html" name="code"><div class="col-xs-12">
<div class="col-xs-6">
<ul class="pagination">共{{ page_nums }}页 {{ count }}条记录</ul>
</div>
<div class="col-xs-6 align-right ">
<ul class="pagination ">
<!--如果数据还有前页,则上一页按钮有效-->
{% if data.has_previous %}
<li><a href="?page={{ data.previous_page_number }}{{ query }}">上一页</a></li>
{% else %}
<li class="active"><a>上一页</a></li>
{% endif %}
<!--分页展示,当前在哪页,当前页的按钮无法使用-->
{% for p in page_range %}
{% ifequal p data.number %}
<li class="active"><a>{{p}}</a></li>
{% else %}
<li><a href="?page={{p}}{{ query }}" title="第{{p}}页">{{p}}</a><li>
{% endifequal %}
{% endfor %}
<!--如果数据还有后页,则下一页按钮有效-->
{% if data.has_next %}
<li><a href="?page={{ data.next_page_number }}{{ query }}">下一页</a></li>
{% else %}
<li class="active"> <a>下一页</a></li>
{% endif %}
</ul>
</div>
</div>
4.在res_list.html中加载pagination.html。如果有页面需要调用分页功能,今后直接在views.py中进行处理,并加载该pagination.html页面即可。
在table的下面引用pagination.html
Res_list.html:
<!--引入modal.html-->
{% include 'modal.html' %}
<!--引入pagination.html-->
{% include 'pagination.html' %}
5.测试效果:
如果表格数据量过多,需要对表格进行分页处理。而Django自带了分页机制,具体可以参见https://docs.djangoproject.com/en/1.9/topics/pagination/
在view中,我们创建一个分页函数pagination,并单独建立一个分页机制的文件,以供所有表格分页时使用。
1.在views中建立pagination函数,用于分页。为了测试方便,我们每页仅显示2条记录。
Views.py:
#分页函数
def pagination(request, queryset, display_amount=2, after_range_num = 5,before_range_num = 4):
#按参数分页
try:
#从提交来的页面获得page的值
page = int(request.GET.get("page", 1))
#如果page值小于1,那么默认为第一页
if page < 1:
page = 1
#若报异常,则page为第一页
except ValueError:
page = 1
#引用Paginator类
paginator = Paginator(queryset, display_amount)
#总计的数据条目
count = paginator.count
#合计页数
num_pages = paginator.num_pages
try:
#尝试获得分页列表
objects = paginator.page(page)
#如果页数不存在
except EmptyPage:
#获得最后一页
objects = paginator.page(paginator.num_pages)
#如果不是一个整数
except PageNotAnInteger:
#获得第一页
objects = paginator.page(1)
#根据参数配置导航显示范围
temp_range = paginator.page_range
#如果页面很小
if (page - before_range_num) <= 0:
#如果总页面比after_range_num大,那么显示到after_range_num
if temp_range[-1] > after_range_num:
page_range = xrange(1, after_range_num+1)
#否则显示当前页
else:
page_range = xrange(1, temp_range[-1]+1)
#如果页面比较大
elif (page + after_range_num) > temp_range[-1]:
#显示到最大页
page_range = xrange(page-before_range_num,temp_range[-1]+1)
#否则在before_range_num和after_range_num之间显示
else:
page_range = xrange(page-before_range_num+1, page+after_range_num)
#返回分页相关参数
return objects, page_range, count, num_pages
2.
在之前的列表函数中,调用pagination函数,从而对具体的data数据来进行分页处理:
def lists(request, table):
…
#将分页的信息传递到展示页面中去
data_list, page_range, count, page_nums = pagination(request, data)
#建立context字典,将值传递到相应页面
context = {
'data': data_list,
'table': table,
'page_range': page_range,
'count': count,
'page_nums': page_nums,
'sub_title': sub_title,
}
#跳转到相应页面,并将值传递过去
return render(request,list_template,context)
3.建立单独的html,存放pagination的显示内容。
Pagination.html:
<pre class="html" name="code"><div class="col-xs-12">
<div class="col-xs-6">
<ul class="pagination">共{{ page_nums }}页 {{ count }}条记录</ul>
</div>
<div class="col-xs-6 align-right ">
<ul class="pagination ">
<!--如果数据还有前页,则上一页按钮有效-->
{% if data.has_previous %}
<li><a href="?page={{ data.previous_page_number }}{{ query }}">上一页</a></li>
{% else %}
<li class="active"><a>上一页</a></li>
{% endif %}
<!--分页展示,当前在哪页,当前页的按钮无法使用-->
{% for p in page_range %}
{% ifequal p data.number %}
<li class="active"><a>{{p}}</a></li>
{% else %}
<li><a href="?page={{p}}{{ query }}" title="第{{p}}页">{{p}}</a><li>
{% endifequal %}
{% endfor %}
<!--如果数据还有后页,则下一页按钮有效-->
{% if data.has_next %}
<li><a href="?page={{ data.next_page_number }}{{ query }}">下一页</a></li>
{% else %}
<li class="active"> <a>下一页</a></li>
{% endif %}
</ul>
</div>
</div>
4.在res_list.html中加载pagination.html。如果有页面需要调用分页功能,今后直接在views.py中进行处理,并加载该pagination.html页面即可。
在table的下面引用pagination.html
Res_list.html:
<!--引入modal.html-->
{% include 'modal.html' %}
<!--引入pagination.html-->
{% include 'pagination.html' %}
5.测试效果:
相关文章推荐
- 理解I/O Completion Port
- 正数(十进制)变二进制 除以2取余 小数(十进制)变二进制 乘以2取整数
- srs之gop_cache
- ArrayList简介
- c3p0
- 练习四 1001
- jsp重定向,数据库语言在jsp中的实现
- Walker登录页面
- iOS与HTML5交互方法总结
- php函数serialize()与unserialize()
- 2016C#模拟谷歌Google登陆Gmail&Youtube小案例
- AOP
- Submission Details
- Python爬虫入门一
- 推送文件(expect交互式方式与sshpass非交互式方式)
- Poj 3468 A Simple Problem with Integers(树状数组&&线段树)
- 解决ExpandableListView的OnItemLongClickListener无法准确获取position的问题
- 数组
- bzoj 4430: [Nwerc2015]Guessing Camels赌骆驼
- 【造轮子系列】一个选择星期的工具——SweepSelect View