问题
1、当返回数据较多,如设置每页展示10条,数据接近200条,返回页码范围1~20,前端每个页码都显示的话,就会出现页码超出当前页面,被遮挡的页码无法操作和显示不美观;
2、列表的所在页码,总分页数,跳转不在动态页面的页数
解决
在使用paginator转化为Page对象后,获取到num_pages:总的页码数,配合当前页码,进行判断
显示列表的所在页码,总分页数,实现跳转不在动态页面的页数
效果
实现
views.py
def api_list(request):
p_index = int(request.GET.get('page', 1)) # 当前页码
api_list = API_Manage().get_all_api_list() # 查询的数据
page_size = 10 # 每页大小
# 设置每页10条数据,paginator
paginator = Paginator(api_list, per_page=page_size)
# 当前页码
current_page = paginator.get_page(p_index).number
# 页面数据
page = paginator.page(p_index)
# 页码超过12页,进行动态返回页码范围
if paginator.num_pages > 12:
if current_page - 5 < 1: # 当前页小于5
page_range = range(1, 11)
elif current_page + 5 > paginator.num_pages: # 当前页+5大于总页码
page_range = range(current_page - 5, paginator.num_pages + 1)
else:
page_range = range(current_page - 5, current_page + 5)
else:
page_range = paginator.page_range
print(page_range)
data = {'page': page, 'paginator': paginator, 'current_page': current_page, 'page_range': page_range}
return render(request, 'api_list.html', data)
动态返回页码逻辑:
如果当前页码-5,小于1,返回的页码范围: (1,11)
如果当前页码-5>1,且当前页码+5小于总页码,范围(当前页码-5,当前页码+5)
如果当前页码-5>1,且当前页码+5大于总页码,范围(当前页码-5,总的页码数+1)
html
<div class="container" id="nav" style="text-align:center;">
<ul class="pagination" id="page" >
<li>共{{ paginator.num_pages }}页/第{{page.number}}页 跳转到第
<input type="number" style="width: 50px" min="1" max = {{paginator.num_pages}} value="{{ current_page }}">页
<button>跳转</button></li>
{% if page.has_previous %}
<li class="previous"><a href="{{ request.path }}?page={{ page.previous_page_number }}">上一页</a></li>
{% else %}
<li class="previous disabled"><a href="#">上一页</a></li>
{% endif %}
{% for num in page_range %}
{% if num == current_page %}
<li class="active" style="backgroud:#C6E2FF"><a href="{{ request.path }}?page={{ num }}">{{ num }}</a></li>
{% else %}
<li class="item"><a href="{{ request.path}}?page={{ num }}">{{ num }}</a></li>
{% endif %}
{% endfor %}
{% if page.has_next %}
<li class="next"><a href="{{ request.path}}?page={{ page.next_page_number }}">下一页</a></li>
{% endif %}
</ul>
</div>
<script type="text/javascript">
$('button').click(function () {
var num = $('input').val();
console.log(num);
if(num<=0 || num>{{ paginator.num_pages }}){
$('input').val('');
}else{
window.location.href='{{ request.path}}?page='+num;
}
})
</script>
- 页码居中:
div 标签设置:style=“text-align:center;”
- 页面跳转
设置默认值、最小值、最大值:min=“1” max = {{paginator.num_pages}} value="{{ current_page }}
<li>共{{ paginator.num_pages }}页/第{{page.number}}页 跳转到第
<input type="number" style="width: 50px" min="1" max = {{paginator.num_pages}} value="{{ current_page }}">页
<button>跳转</button></li>
- 动态页码
{% for num in page_range %}
{% if num == current_page %}
<li class="active" style="backgroud:#C6E2FF"><a href="{{ request.path }}?page={{ num }}">{{ num }}</a></li>
{% else %}
<li class="item"><a href="{{ request.path}}?page={{ num }}">{{ num }}</a></li>
{% endif %}
{% endfor %}