首页 > 其他 > 详细

django分页器

时间:2019-04-05 20:44:44      阅读:151      评论:0      收藏:0      [点我收藏+]

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

分页器的使用

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

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})


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



index.html
使用了bootstrap的分页组件,active当前页突出显示,disabled鼠标悬浮时显示禁止(实际上还是可以点,需要自己加入判断)

<!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的导入

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())  #上一页的页码   

django分页器

原文:https://www.cnblogs.com/zzliu/p/10659729.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!