django分页


Django--分页功能

需要用到django中的Paginator模块

导入:from django.core.paginator import Paginator

本案例以图书管理为模版

class BorrowBook(models.Model):
    """
    借出图书查询
    """
    reader = models.ForeignKey(Reader, on_delete=models.CASCADE)
    # manager = models.ForeignKey(Manager, on_delete=models.CASCADE)
    borrow_book = models.DateTimeField(auto_now_add=True)
    restore_book = models.DateTimeField()
    book_state = models.CharField(max_length=50)
    books = models.ForeignKey(Books, on_delete=models.CASCADE)

数据库中的数据

开始分页制作

  • ##### 导入分页模块

    from django.core.paginator import Paginator
  • ##### 查询所有数据列表queryset对象

    book_list = BorrotBook.objects.all()
  • ##### 实例化对象

    paginator = Paginator(book_list, 10)
  • ##### Paginator类对象的属性

序号 属性名 说明
1 num_pages 返回分页之后的总页数
2 page_range 返回分页后的页码列表
  • ##### Paginator类对象的方法
序号 方法名 说明
1 page(self, number) 返回第number页的page类实例对象
  • ##### Page实例对象的属性
序号 属性名 说明
1 number 返回当前页的页码
2 object_list 返回当前页的数据查询集
3 paginator 返回对应的 **Paginator** 类对象
  • ##### page实例对象的方法
序号 方法名 说明
1 has_previous 判断当前页是否有前一页
2 has_next 判断当前页是否有下一页
3 previous_page_number 返回前一页的页码
4 next_page_number 返回下一页的页码

写views函数

# 带返回值参数的views函数
def borrow_show(request, pindex):
    """
    已借图书查询并展示到前端页面
    """
    book_obj = BorrowBook.objects.all()  # 获取借书表中所有的数据
    book_list = []  # 创建一个空列表,存放当前登陆人所借过的书
    for i in book_obj:  # 遍历所有的借书记录,查找到当前登陆人所借的书,并放入空列表
        if i.reader.read_code == request.session["user_id"]:
            book_list.append(i)
    paginator = Paginator(book_list, 5)  # 实例化Paginator, 每页显示5条数据
    if pindex == "":  # django中默认返回空值,所以加以判断,并设置默认值为1
        pindex = 1
    else:  # 如果有返回在值,把返回值转为整数型
        int(pindex) 
    page = paginator.page(pindex)  # 传递当前页的实例对象到前端
    context = {"message": request.session["user_name"], "page": page}
    return render(request, "books/borrow_show.html", context)

urls配置

from django.urls import path
from .import views

app_name = "books"
urlpatterns = [

    # 已借图书查询并展示
    path("borrow_show/<pindex>", views.borrow_show, name="borrow_show"),
    ]

Html中配置

<--当前页内容遍历展示-->
    {%for item in page%}
        <tr>
            <td width="120px">{{forloop.counter}}</td>
            <td width="150px"><a href="" style="color: #0f0f0f">                                        {{item.books.book_name}}</a></td>
            <td width="120px">{{item.books.book_author}}</td>
            <td width="120px">{{item.books.book_price}}</td>
            <td width="120px">{{item.books.book_concern}}</td>
            <td width="120px">{{item.books.book_type.book_type}}</td>
            <td width="120px">{{message}}</td>
            <td width="120px">{{item.borrow_book}}</td>
        </tr>
    {%endfor%}

<--底部分页按钮显示-->
    <nav aria-label="Page navigation">
        <div class="pagination">
            <ul class="pagination">
            {% if page.has_previous %}   # 判断当前页是否有上一页
                <li><a href="/books/borrow_show/{{page.previous_page_number}}" aria-label="Previous">
                    <span aria-hidden="true">«</span></a></li>
            {% endif %}

            {% for num in page.paginator.page_range%}  # 循环遍历页码列表,并展示到底部
                {%if pindex == page.number%}
                    <li><a href="">{{ num }}</a></li>
                {%else%}
                    <li><a href="/books/borrow_show/{{num}}">{{ num }}</a></li>
                {%endif%}
             {% endfor %}

             {% if page.has_next %}  # 判断当前页是否有下一页
                 <li><a href="/books/borrow_show/{{page.next_page_number}}" aria-label="Next">
                      <span aria-hidden="true">»</span></a></li>
              {% endif %}
            </ul>
        </div>
    </nav>

最终效果展示