django中如何实现分页功能及分页对象中常用的属性和方法

先上最终实现结果:

一:views.py中的代码

from django.core.paginator import Paginator


def index(request, page_num):
    if len(page_num) == 0:
        page_num = 1
    # 1. 把需要分页的数据全部查询出来
    all_data = PassPicture.objects.all()
    # 2. 利用查询出来的数据,创建一个分页器对象
    # 参数1:要分页的数据;参数2:设置每页要展示的数据个数;参数3:如果最后一页不到5个数据,是否将最后一页的数据合并到上一页进行展示;默认是False,不合并;
    paginator = Paginator(all_data, 10)
    # page对象有三个属性:
    # a> page.number: 表示当前查询的页码;
    # b> page.object_list: 表示当前页要展示的数据;
    # c> page.paginator: 它就是上面创建的Paginator(user_list, 5)这个对象,无论是哪一页,这个paginator对象始终跟着Page对象;
    # 3. 调用paginator分页器对象的page方法,返回number页的Page类实例对象
    page = paginator.page(page_num)

    return render(request, "boloni/传图.html", {"page": page})

二:urls.py中的代码:

urlpatterns = [
    re_path(r'^index/(\d*)$', views.index, name="index"),  # 首页
]

三:html中的代码

{# 表格区域 #} 
<table class="table table-bordered table-hover">
{% for data in page.object_list %}
    <tr>
        <td>{{ data.id }}</td>
        <td>{{ data.name }}</td>
        <td>{{ data.customer_id|default_if_none:"" }}</td>
    </tr>
{% endfor %}
</table>

{# 页面底部 #}
<ul class="pager">
    <li><a href="/index/"><span class="glyphicon glyphicon-step-backward"></span></a></li>
    {% if page.has_previous %}
        <li><a href="/index/{{ page.previous_page_number }}"><span class="glyphicon glyphicon-triangle-left"></span></a></li>
    {% else %}
        <li><a href=""><span class="glyphicon glyphicon-triangle-left"></span></a></li>
    {% endif %}
    <li>&nbsp;第&nbsp;<input type="text" value="{{ page.number }}" class="page_num">&nbsp;页&nbsp;</li>
    {% if page.has_next %}
        <li><a href="/index/{{ page.next_page_number }}"><span class="glyphicon glyphicon-triangle-right"></span></a></li>
    {% else %}
        <li><a href=""><span class="glyphicon glyphicon-triangle-right"></span></a></li>
    {% endif %}
    <li><a href="/index/{{ page.paginator.num_pages }}"><span class="glyphicon glyphicon-step-forward"></span></a></li>
    <li>&nbsp;&nbsp;共{{ all_rows }}条,共{{ page.paginator.num_pages }}页</li>
</ul>

 四、分页常用的属性和方法

五:进行页码的控制,页面上最多显示指定个数的页码,此案例最多显示5个页码

views.py中的代码

# todo: 进行页码的控制,页面上最多显示5个页码
# 1. 当总页数小于5页时,显示所有页码
# 2. 如果当前页是前3页,显示1-5页
# 3. 如果当前页是后3页,显示最后5页
# 4. 其他情况,显示当前页的前2页,当前页,当前页的后2页
# pages就是构建的页码列表
num_pages = paginator.num_pages
if num_pages < 5:
    pages = range(1, num_pages + 1)
elif page <= 3:
    pages = range(1, 6)
elif num_pages - page <= 2:
    pages = range(num_pages - 4, num_pages + 1)
else:
    pages = range(page - 2, page + 3)

构建页码列表总结:其实实现页码控制就是自己构建一个页码列表,最终将页码列表传递给模板,

从而代替原始使用的页码列表:page.paginator.page_range

六:分页的通过控制写法

        #分页
        paginator = Paginator(orders, 1)
        
        # 处理页码
        try:
            page = int(page)
        except Exception as err:
            page = 1

        if page > paginator.num_pages:
            # page页数不存在
            page = 1

        # 获取第page页的Page实例对象
        order_page = paginator.page(page)

        # todo: 进行页码的控制,页面上最多显示5个页码
        # 1. 当总页数小于5页时,显示所有页码
        # 2. 如果当前页是前3页,显示1-5页
        # 3. 如果当前页是后3页,显示最后5页
        # 4. 其他情况,显示当前页的前2页,当前页,当前页的后2页
        num_pages = paginator.num_pages
        if num_pages < 5:
            pages = range(1, num_pages + 1)
        elif page <= 3:
            pages = range(1, 6)
        elif num_pages - page <= 2:
            pages = range(num_pages - 4, num_pages + 1)
        else:
            pages = range(page - 2, page + 3)

最终使用的两个变量就是:order_page页码对象,第二个就是:pages页码列表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

专职

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值