zoukankan      html  css  js  c++  java
  • Django分页器

    一.分页器

    分页功能是所有网页上都需要提供的功能,当要展示的条目比较多时,就需要进行分页,不但能减小数据库读取数据压力,也有利于用户浏览。
    Django为我们提供了一个Paginator分页工具,这个类帮助我们来管理分页数据,该类存放在django/core/paginator.py它可以接收列表、元组或其他可迭代对象。
    

    实例:

    from django.core.paginator import Paginator
    lis = ['yven','lqz','egon','hwt','lyf']
    # 对lis进行分页,每页2条数据
    p = Paginator(lis,2)
    
    # 每页显示条目数量,显示2
    print(p.per_page)
    
    # page对象
    print(p.page)
    
    # 对象的个数,显示5
    print(p.count)
    
    # 总共几页,显示3
    print(p.num_pages)
    
    # 分页范围,返回一个可迭代对象 显示range(1,4)
    print(p.page_range)
    
    # 获取第一页
    page1 = p.page(1)
    # 显示<Page 1 of 3>
    print(page1)
    # 获取第一页的对象 显示['yven', 'lqz']
    print(page1.object_list)
    
    page2 = p.page(2)
    # 当前页页码 显示2
    print(page2.number)
    # paginator对象
    print(page2.paginator)
    print(page2.object_list) #['egon', 'hwt']
    # 判断是否有下一页 显示True
    print(page2.has_next())
    # 判断是否有上一页 显示True
    print(page2.has_previous())
    # 判断是否其他页 显示True
    print(page2.has_other_pages())
    # 获取下一页页码 显示3
    print(page2.next_page_number())
    # 获取上一页页码 显示1
    print(page2.previous_page_number())
    

    所以,使用Paginator分四步:

    使用任何方法,获取要展示的对象列表QuerySet;

    将列表和每页个数传递给Paginator,返回一个分页对象;

    调用该对象的各种方法,获取各种分页信息;

    在HTML模板中,使用上面的分页信息构建分页栏。

    二.使用Paginator

    批量导入数据

    需要插入需要调数据时,大部分人会想到使用循环来插入输入,但这样会影响效率,因为每次循环都会去找到那张表,再进行插入记录,所以这时就可以使用bulk_create实现批量插入,效率会更高。

    def index(request):
    
        book_list = []
        for i in range(100):
            book_list.append(models.Book(name='图书%s'%i,price=10+i))
        models.Book.objects.bulk_create(book_list)
        return HttpResponse('ok')
    

    将图书列表中的数据分页展示出来,每页3个数据

    视图层:

    def index(request):
        book_list = models.Book.objects.all().order_by('id')
        # 每页显示3条
        paginator = Paginator(book_list, 3)
        try:
            # 前端返回页码
            page = int(request.GET.get('page'))
            current = paginator.page(page)
            # 判断总页码数是否大于9
            if paginator.num_pages > 9:
                # 判断页码是否小于5
                if page < 5:
                    page_range = range(1, 10)
                elif page + 4 > paginator.num_pages:
                    page_range = range(paginator.num_pages - 8, paginator.num_pages + 1)
                else:
                    page_range = range(page - 4, page + 5)
            else:
                # 小于9页,有多少页就显示多少页
                page_range=paginator.page_range
        except Exception as e:
            page = 1
            current = paginator.page(page)
            if paginator.num_pages > 9:
                if page < 5:
                    print('aaa')
                    page_range = range(1, 10)
            else:
                page_range = paginator.page_range
        return render(request, 'index.html', locals())
    

    模板层

    <table class="table table-hover">
        <tr>
            <th>id</th>
            <th>书名</th>
            <th>单价</th>
        </tr>
        {% for book in current %}
        <tr>
            <td>{{ forloop.counter }}</td>
            <td>{{ book.name }}</td>
            <td>{{ book.price }}</td>
        </tr>
        {% endfor %}
    </table>
    <nav aria-label="Page navigation">
        <ul class="pagination">
            {% if current.has_previous %}
            <li>
                <a href="/index/?page={{ current.previous_page_number }}" aria-label="Previous">
                    <span aria-hidden="true">上一页</span>
                </a>
            </li>
            {% else %}
            <li class="disabled">
                <a href="" aria-label="Previous">
                    <span aria-hidden="true">上一页</span>
                </a>
            </li>
            {% endif %}
    
            {% for foo in page_range %}
            {% if page == foo %}
            <li class="active"><a href="/index/?page={{ foo }}">{{ foo }}</a></li>
            {% else %}
            <li><a href="/index/?page={{ foo }}">{{ foo }}</a></li>
            {% endif %}
    
            {% endfor %}
    
            {% if current.has_next %}
            <li>
                <a href="/index/?page={{ current.next_page_number }}" aria-label="Next">
                    <span aria-hidden="true">下一页</span>
                </a>
            </li>
            {% else %}
            <li class="disabled">
                <a href="" aria-label="Next">
                    <span aria-hidden="true">下一页</span>
                </a>
            </li>
            {% endif %}
        </ul>
    </nav>
    

    三.Paginator对象

    Paginator类拥有以下方法和属性:
    属性:
    count:对象的个数
    num_pages:页面总数
    page_range:基于1的页数范围迭代器
    方法:
    Paginaor.page(number):返回指定页面的对象列表
    

    四.异常处理

    在实例使用中,用户请求的页面,可能千奇百怪,这就会有可能导致异常,需要特别处理,Django为我们内置了下面几个Paginator相关异常。
    1.exception InvalidPage[source]:异常的基类,当paginator传入一个无效的页码时抛出。
    2.exception PageNotAnInteger[source]:当向page()提供一个不是整数的值时抛出。
    3.exception EmptyPage[source]:当向page()提供一个有效值,但是那个页面上没有任何对象时抛出。
    
  • 相关阅读:
    python爬虫实战(1)--爬取糗事百科
    python爬虫(5)--正则表达式
    python爬虫(4)--Cookie的使用
    python爬虫(3)--异常处理
    python爬虫(2)--Urllib库的高级用法
    EQ2008 LED控制卡二次开发
    C# 遍历对象属性取值赋值
    BootStrap Table
    MongoDB 操作
    SQL Server 2008(R2) 数据库使用外网IP实例连接服务器
  • 原文地址:https://www.cnblogs.com/louyefeng/p/9990571.html
Copyright © 2011-2022 走看看