您当前的位置:首页 > IT编程 > python
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:Django分页器的用法你都了解吗

51自学网 2021-10-30 22:37:32
  python
这篇教程Django分页器的用法你都了解吗写得很实用,希望能帮到您。

Django是一个大而全的框架。需要明确的是,传参进行分页获取分页后的数据,一般都是通过向服务器发送get请求的方式实现的,在向后端服务发送查看数据的同时可以携带一个或多个参数并发送get请求来实现分页查看功能

前面总结过drf框架中分页器的使用,本文主要介绍在利用Django开发MVT模型项目时分页器的使用

1、准备基础数据

设计表模型

为了体现分页的效果,需要先创建一个表并准备较多数据,模型如下

from django.db import models# Create your models here.class Book(models.Model):    title = models.CharField(max_length=32)    price = models.DecimalField(max_digits=9, decimal_places=2)  # 9999999.99

执行数据库迁移后,设计一个视图函数,通过触发视图函数往此表中批量插入数据

Django中利用orm实现批量插入一般有两种方式:单条插入或者利用bulk_create批量插入

最终翻译转换成sql语句也就类似于多条insert语句和一条insert的区别

def create_book(request):    # 批量插入方式一    for i in range(100):        Book.objects.create(title="book"+str(i),price=i*i)		# 批量插入方式二    book_list = []    for i in range(100):        book = Book(title="book"+str(i),price=i*i)        book_list.append(book)    Book.objects.bulk_create(book_list)        return HttpResponse("添加成功")

2、一次性展示数据

接下来通过模板语法一次性将数据展示到前端页面

视图函数如下

def get_books(request):    book_list = Book.objects.all()    return render(request, "index.html", {"book_list": book_list})

模板页面index.html如下

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Title</title></head><body><ul>    {% for book in book_list %}    <li>{ book.title } : { book.price }</li>    {% endfor %}</ul></body></html>

这时一次性访问即展示了所有的book

3、引入分页器

引入分页器后,可以对全局分页对象和单页对象进行相关操作,相关语法

# 引入分页器from django.core.paginator import Paginator		...    # 全局分页器对象    paginator = Paginator([1,2,3,4,5,6,7,8,9,10],3)    print(paginator.count) # 10  数据总数    print(paginator.num_pages)  # 4  总页数    print(paginator.page_range) # range(1, 5)  页码的列表    # 单页对象    page = paginator.page(2)    print(page.has_next())  # 是否有下一页    print(page.next_page_number())  # 写一页的页码    print(page.has_previous())  # 是否有上一页    print(page.previous_page_number())  # 上一页的页码    # 取出单页对象的值    print(page.object_list) # [4, 5, 6]    for i in page:       print(i)

在这里的例子中具体使用分页器及模板语法,例如每页取出8条,获取用户给出的页码条件数,返回相应页的数据,默认不给出任何条件时返回第一页的数据

from django.core.paginator import Paginator   # 取出当前用户页码   current_num = int(request.GET.get("page", 1))   book_list = Book.objects.all()   paginator = Paginator(book_list, 8)   page = paginator.page(current_num)     return render(request,"index.html",{"page":page})

最后,可以利用bootstrap组件在页面模板中添加翻页的按钮,在当前页时按钮加深,没有上一页时禁止点击

...<body><ul>    {% for book in page %}    <li>{ book.title } : { book.price }</li>    {% endfor %}</ul><nav aria-label="Page navigation">  <ul class="pagination">    {% if page.has_previous %}    <li>      <a href="/?page={ page.previous_page_number }" rel="external nofollow"  aria-label="Previous">        <span aria-hidden="true">上一页</span>      </a>    </li>    {% else %}    <li class="disabled">      <a href="#" rel="external nofollow"  rel="external nofollow"  aria-label="Previous">        <span aria-hidden="true">上一页</span>      </a>    </li>    {% endif %}      {% for num in page_range %}      {% if num == current_num %}          <li class="active"><a href="/?page={ num }" rel="external nofollow"  rel="external nofollow" >{ num }</a></li>      {% else %}          <li><a href="/?page={ num }" rel="external nofollow"  rel="external nofollow" >{ num }</a></li>      {% endif %}      {% endfor %}    <li>      <a href="#" rel="external nofollow"  rel="external nofollow"  aria-label="Next">        <span aria-hidden="true">下一页</span>      </a>    </li>  </ul></nav></body>...

在视图函数中:处理相关异常;传递相关参数;当页码较多时只显示部分页码,例如最多时总共10个页码,当前页码始终在中间显示;单独处理出现边界情况,负数页码的情况及最大页码用完的情况

from django.core.paginator import Paginator		...    # 取出当前用户页码    current_num = int(request.GET.get("page", 1))    book_list = Book.objects.all()    paginator = Paginator(book_list, 8)    page = paginator.page(current_num)    # 大于11页时    if paginator.num_pages > 11:        # 当前页码的后5页数超过最大页码时,显示最后10项        if current_num + 5 > paginator.num_pages:            page_range = range(paginator.num_pages - 10, paginator.num_pages + 1)        # 当前页码的前5页数为负数时,显示开始的10项        elif current_num - 5 < 1:            page_range = range(1, 12)        else:            # 显示左5页到右5页的页码            page_range = range(current_num - 5, current_num + 5 + 1)    # 小于11页时显示所有页码    else:        page_range = paginator.page_range    return render(request, "index.html", {"page": page, "paginator": paginator, "current_num": current_num, "page_range": page_range})

以上就是Django分页器的用法你都了解吗?的详细内容,更多关于Django分页器的资料请关注51zixue.net其它相关文章!


tensorflow中的梯度求解及梯度裁剪操作
TensorFlow的自动求导原理分析
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。