您的位置:首页 > 其它

十三.通过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.测试效果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: