• django分页器


    网站页面的分页效果可以通过分页器实现

    分页器的使用

    urls.py

    from django.contrib import admin
    from django.urls import path
    from app1 import views
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('index/', views.index),
    ]
    
    

    views.py ```python from django.shortcuts import render, HttpResponse from app1.models import Book from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger # Create your views here.

    创建表记录

    def index(request):

    for i in range(100):

    Book.objects.create(title='book_%s' % i, price=i*i)

    上面这种方式生成100条数据会很慢,因为每次都需要找到表,再插入记录

    优化:使用bulk_create依次添加所有数据

    def index(request):

    book_list = [] # 存放book对象

    for i in range(100):

    book = Book(title='book_%s' % i, price=i*i)

    book_list.append(book)

    Book.objects.bulk_create(book_list) # 依次插入100条记录

    return render(request, 'index.html')

    展示

    普通版

    def index(request):

    book_list = Book.objects.all()

    return render(request, 'index.html', {'book_list': book_list})

    使用分页器

    def index(request):

    book_list = Book.objects.all()

    # 第一个参数为对象列表,第二个为每页显示的个数

    paginator = Paginator(book_list, 10) # 每页显示10条

    print(paginator.count) # 总数量

    print(paginator.num_pages) # 总页数

    print(paginator.page_range) # 页码的范围

    page_01 = paginator.page(1) # 第2页的所有数据对象

    print(page_01.has_next()) # 是否还有下一页

    print(page_01.has_previous()) # 是否还有上一页

    print(page_01.next_page_number()) # 下一页的页码

    # print(page_01.previous_page_number()) # 上一页的页码

    return render(request, 'index.html', {'page_01': page_01})

    地址栏输入参数访问页面

    def index(request):

    book_list = Book.objects.all()

    paginator = Paginator(book_list, 10)

    current_num = int(request.GET.get("page", 1))

    book_list = paginator.page(current_num)

    return render(request, 'index.html', {'book_list': book_list})

    加入前一页后一页按钮并分页显示

    def index(request):
    book_list = Book.objects.all()
    paginator = Paginator(book_list, 2) # 故意设置每页显示两个,测试分页效果
    current_num = 1 # 防止报错
    # 捕获异常,防止用户直接在地址栏输入参数造成emptypage错误
    try:
    current_num = int(request.GET.get("page", 1)) # 获取当前页码
    book_list = paginator.page(current_num)
    except EmptyPage:
    book_list = paginator.page(1) #出错时定位到首页

    # 如果页数非常多时,换另外一种显示方式,显示当前页的前5页和后5页,共11页
    if paginator.num_pages > 11:
        if current_num - 5 < 1:  # 如果当前页-5小于1
            # page_range显示页面的范围
            page_range = range(1, 11)  # 展示0~11
        elif current_num + 5 > paginator.num_pages:   # 当前页+5大于总页数
            page_range = range(current_num-5, paginator.num_pages+1)
        else:
            page_range = range(current_num-5, current_num+6)
    else:
        page_range = paginator.page_range
    
    return render(request, 'index.html', {'book_list': book_list, 'paginator': paginator, 'current_num': current_num, 'page_range': page_range})
    

    能在视图函数里获取到的变量就不要在页面获取

    <br>
    index.html
    使用了bootstrap的分页组件,active当前页突出显示,disabled鼠标悬浮时显示禁止(实际上还是可以点,需要自己加入判断)
    ```python
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css">
    </head>
    <body>
    
    <h3>INDEX</h3>
    
    {#<ul>#}
    {#    {% for book in book_list %}#}
    {#        <li>{{ book.title }}-->{{ book.price }}</li>#}
    {#    {% endfor %}#}
    {#</ul>#}
    
    
    {# 数据展示 #}
    
    <ul>
        {% for book in book_list %}
            <li>{{ book.title }}-->{{ book.price }}</li>
        {% endfor %}
    </ul>
    
    {#分页展示#}
    
    <nav aria-label="Page navigation">
      <ul class="pagination">
      {% if book_list.has_previous %}
        {#  有前一页,就-1,否则停留在当前页面    #}
        <li>
          <a href="?page={{ book_list.previous_page_number }}" aria-label="Previous">
             {# 上一页按钮 #}
            <span aria-hidden="true">&laquo;</span>
          </a>
        </li>
      {% else %}
          <li class="disabled">
            {#   鼠标悬浮时显示禁止图标   #}
            {# 跳转当前页面时,href可以不用写 #}
          <a href="" aria-label="Previous">
             {# 上一页按钮 #}
            <span aria-hidden="true">&laquo;</span>
          </a>
        </li>
      {% endif %}
        {# 循环展示每一页的页码 #}
        {% for i in page_range %}
            {% if i == current_num  %}
                {#     当前页面       #}
                <li class="active"><a href="?page={{ i }}">{{ i }}</a></li>
            {% else %}
                <li><a href="?page={{ i }}">{{ i }}</a></li>
            {% endif %}
        {% endfor %}
    
      {% if book_list.has_next %}
        <li>
          <a href="?page={{ book_list.next_page_number }}" aria-label="Next">
            {# 下一页按钮 #}
            <span aria-hidden="true">&raquo;</span>
          </a>
        </li>
      {% else %}
          <li class="disabled">
          <a href="?page={{ current_num }}" aria-label="Next">
            {# 下一页按钮 #}
            <span aria-hidden="true">&raquo;</span>
          </a>
        </li>
      {% endif %}
      </ul>
    </nav>>
    
    
    
    </body>
    </html>
    
    

    ## 小结 ### paginator的导入 ```python from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger ```

    paginator的使用方法

    book_list = Book.objects.all()
    paginator = Paginator(book_list,10)  # 每页显示10条
    print(paginator.count)  #数据总数 100
    print(paginator.num_pages)  # #总页数 10 
    print(paginator.page_range)  #页码的列表 range(1, 11)
    page_01 = paginator.page(2)  #第2页的所有数据对象
    print(page_01.has_next())  #是否有下一页
    print(page_01.has_previous())  #是否有上一页
    print(page_01.next_page_number())  #下一页的页码
    print(page_01.previous_page_number())  #上一页的页码   
    
  • 相关阅读:
    css3 练习
    onethink 返回上一页
    小程序之轮播图
    Node 基本使用
    IDEA Terminal
    Spring Shell简单应用
    Spring Theme简单应用
    Spring MVC的学习笔记
    Win10出现键盘未失灵,按下的键都是快捷键的问题
    SQL Server 添加描述
  • 原文地址:https://www.cnblogs.com/zzliu/p/10659729.html
Copyright © 2020-2023  润新知