【Django】列表数据Paginatior分页,动态返回页码,显示当前页、总页数、跳转页

问题

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 %}

你可能感兴趣的:(django,python,后端)