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())  #上一页的页码   
原文地址:https://www.cnblogs.com/zzliu/p/10659729.html