美文网首页
Django--分页

Django--分页

作者: 临渊如峙 | 来源:发表于2019-02-01 14:52 被阅读0次

    知识储备

    Django提供了一些类实现管理数据分页,这些类位于django/core/paginator.py中。

    1、Paginator对象

    Paginator(列表,int):返回分页对象,参数为列表数据,每一页的条数
    count:对象总数
    num_pages:页面总数
    page_range:页码列表,从1开始,例如[1, 2, 3, 4]
    page(num):下标从1开始,如果提供的页码不存在,抛出InvalidPage异常

    2、Page对象

    Paginator对象的page()方法返回Page对象,不需要手动构造
    object_list:当前页上所有对象的列表
    number:当前页的序号,从1开始
    paginator:当前Page对象相关的Paginator对象
    has_next():如果有下一页返回True
    has_previous():如果有上一页返回True
    has_other_pages():如果有上一页或下一页返回True
    next_page_number():返回下一页的页码,如果下一页不存在,抛出InvalidPage异常
    previous_page_number():返回上一页的页码,如果上一页不存在,抛出InvalidPage异常
    len():返回当前页面对象的个数

    一、基于函数视图的分页

    1、View

    from django.core.paginator import Paginator
    
    # 查询英雄
    def hero(request, page_now):
        if page_now == "":
            page_now = 1
        # 每一页的条数
        page_size = 2
        hero_list = HeroInfo.objects.all()
        # 创建Paginator对象
        my_paginator = Paginator(hero_list, 2)
        # 创建Page对象
        my_page = my_paginator.page(page_now)
        # 渲染模板,返回响应
        return render(request, "hero.html", {"hero_list": hero_list, "my_page": my_page})
    

    2、Template

    <ul>
            {% for hero in my_page.object_list %}
            <li>
                {{ hero.hname }}&nbsp;&nbsp;&nbsp;&nbsp;
                <a href="/myhero/hero_delete/{{ hero.id }}">删除</a>
                <a href="/myhero/hero_edit/{{ hero.id }}">编辑</a>
            </li>
            {% endfor %}
        </ul>
        {% if my_page.has_previous %}
            <a href="/myhero/hero/{{ my_page.previous_page_number }}">上一页</a>
        {% endif %}
        {% for i in my_page.paginator.page_range %}
            {% if my_page.number == i %}
                <span>{{ i }}</span>
            {% else %}
                <a href="/myhero/hero/{{ i }}">{{ i }}</a>
            {% endif %}
        {% endfor %}
        {% if my_page.has_next %}
            <a href="/myhero/hero/{{ my_page.next_page_number }}">下一页</a>
        {% endif %}
    

    二、基于类视图的分页

    1、View

    class HeroListView(ListView):
        queryset = HeroInfo.objects.all()
        context_object_name = 'hero_list'
        template_name = 'hero.html'
        # 分页,默认使用page_obj对象
        paginate_by = 2
    

    2、Template

    <ul>
            {% for hero in hero_list %}
            <li>
                {{ hero.hname }}&nbsp;&nbsp;&nbsp;&nbsp;
                <a href="/myhero/hero_delete/{{ hero.id }}">删除</a>
                <a href="/myhero/hero_edit/{{ hero.id }}">编辑</a>
            </li>
            {% endfor %}
        </ul>
        {% if page_obj.has_previous %}
            <a href="/myhero/hero_list?page={{ page_obj.previous_page_number }}">上一页</a>
        {% endif %}
        {% for i in page_obj.paginator.page_range %}
            {% if page_obj.number == i %}
                <span>{{ i }}</span>
            {% else %}
                <a href="/myhero/hero_list?page={{ i }}">{{ i }}</a>
            {% endif %}
        {% endfor %}
        {% if page_obj.has_next %}
            <a href="/myhero/hero_list?page={{ page_obj.next_page_number }}">下一页</a>
        {% endif %}
    

    相关文章

      网友评论

          本文标题:Django--分页

          本文链接:https://www.haomeiwen.com/subject/krbhyftx.html