Python Django Web开发——内置分页器的学习以及使用Bootstrap的分页器美化前端显示

Django 内置的分页器功能 Paginator 非常容易实现数据的分页显示,及对应的控制

先不使用Paginator,自己造一个分页器,主要利用的是数据库查询的数据集的切片。

def get_students(request):
    # 用数据库分页方法实现分页展示
    # http://127.0.0.1:8000/app/getstudents/?page=4&perpage=10,用这个?page=4&perpage=10传递参数
    # 如果没有获取到参数,则设置默认值第1页,每页数量10条
    page=int(request.GET.get('page',1))
    per_page=int(request.GET.get('perpage',10))
    students=Students.objects.all()[per_page*(page-1):per_page*page]
    # students=Students.objects.all()
    data={
        'students':students,
    }
    return render(request,'students.html',context=data)
<h1>学生列表</h1>
<ul>
    {% for student in students %}
        <li>{{ student.s_name }}-年龄是-{{ student.s_age }}</li>
    {% endfor %}

</ul>

使用自带的分页器Paginator 功能

# 用Django自带的分页器功能实现分页
def get_students_with_page(request):
    page=int(request.GET.get('page',1))
    per_page=int(request.GET.get('perpage',10))
    students=Students.objects.all()
    paginator=Paginator(students,per_page)
    page_object=paginator.page(page)
    data={
        'object_list':page_object,
        'page_list':paginator.page_range,
    }
    return render(request,'get_students_with_page.html',context=data)

前端的代码附加bootstrap优化显示效果,其中使用 Paginator 的属性

  • number
  • object_list
  • page_range
  • previous_page_number
  • next_page_number
  • has_previous
  • has_next
    其中 has_previous 和has_next 用在分页器的首尾判断是否存在,避免超出范围报错。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
    {#    注意 bootstrap和  jquery 不是版本越高越好,要考虑浏览器的版本问题  #}
    {#    <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/5.0.2/css/bootstrap.css" rel="stylesheet">#}
    <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.css" rel="stylesheet">
    {#    <script type="text/javascript" src="https://cdn.bootcdn.net/ajax/libs/jquery/1.11.1/jquery.js"></script>#}
    <script type="text/javascript" src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script>
    <script type="text/javascript"
            src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/5.0.2/js/bootstrap.js"></script>

</head>
<body>


<h1>学生列表</h1>
<ul>
    {% for object in object_list.object_list %}
        <li>{{ object.s_name }}------{{ object.s_age }}</li>

    {% endfor %}

</ul>
<h2>用paginator实现点击页面跳转到对应的页面内容</h2>
<ul>
    {% for page in page_list %}
        {#        <a href="/app/getstudentswithpage/?page={{ page }}">{{ page }}</a>#}
        <a href="{% url 'app:get_students_with_page' %}/?page={{ page }}">{{ page }}</a>
    {% endfor %}

</ul>

<nav aria-label="Page navigation">
    <ul class="pagination">
        {#  加入判断是否有上一页,否则到第一页再点上一页就报错了#}
        {% if object_list.has_previous %}
            <li>
                <a href="{% url 'app:get_students_with_page' %}?page={{ object_list.previous_page_number }}"
                   aria-label="Previous">
                    <span aria-hidden="true">&laquo;</span>
                </a>
            </li>
        {% else %}
            <li class="previous disabled">
                <a href="#" aria-label="Previous">
                    <span aria-hidden="true">&laquo;</span>
                </a>
            </li>
        {% endif %}


        {% for page in page_list %}
            {#        将当前选中的页码在前端加亮#}
            {% ifequal page object_list.number %}
                {#        <a href="/app/getstudentswithpage/?page={{ page }}">{{ page }}</a>#}
                <li class="active"><a href="{% url 'app:get_students_with_page' %}/?page={{ page }}">{{ page }}</a></li>
            {% else %}
                <li><a href="{% url 'app:get_students_with_page' %}/?page={{ page }}">{{ page }}</a></li>
            {% endifequal %}
        {% endfor %}
        {% if object_list.has_next %}
            <li>
                <a href="{% url 'app:get_students_with_page' %}?page={{ object_list.next_page_number }}"
                   aria-label="Next">
                    <span aria-hidden="true">&raquo;</span>
                </a>
            </li>
        {% else %}
            <li class="disabled">
                <a href="" aria-label="Next">
                    <span aria-hidden="true">&raquo;</span>
                </a>
            </li>
        {% endif %}

    </ul>
</nav>


</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值