文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Django分页器

2023-01-30 22:44

关注

一.分页器

分页功能是所有网页上都需要提供的功能,当要展示的条目比较多时,就需要进行分页,不但能减小数据库读取数据压力,也有利于用户浏览。
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()提供一个有效值,但是那个页面上没有任何对象时抛出。
阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯