Python学习第163天(分页初步实现)

  先说一下自行实现分页是如何进行的

USER_LIST=[]
# 1.类似于我们从数据库中查收到的所有数据
for i in range(1,999):
temp = {'name':'root'+str(i),'age':i}
USER_LIST.append(temp)

def index(req):
per_page_count =10
# 2.设定每页显示的信息的个数
current_page =req.GET.get('p')
# 3.通过前段获取当前所在页面的页码
current_page = int(current_page) # 此时获得的页码数据类型为字符串,需要进行格式转换
# p = 1
start = (current_page-1)*per_page_count
end = current_page*per_page_count
# 4.通过当前页信息获取本页显示的所有内容范围
data = USER_LIST[start:end]
# 5.通过内容标签的范围来确定本页显示内容,并将此数据返回给前段
prev_count = current_page-1
next_count = current_page+1
# 6.上一页和下一页就是通过将p值减一或加一,然后刷新页面重新提交
return render(req,'index.html',{'user_list':data,'next_page':next_count,'prev_page':prev_count})

   然后是关于Django自带的分页内容,这里主要集中了两个类,分别是Paginator、Page

  Paginator可以通过内置的page方法生成Page对象,反之Page类也可以这样操作

  

from django.shortcuts import render
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

L = []
for i in range(999):
    L.append(i)

def index(request):
    current_page = request.GET.get('p')

    paginator = Paginator(L, 10)
    # per_page: 每页显示条目数量
    # count:    数据总个数
    # num_pages:总页数
    # page_range:总页数的索引范围,如: (1,10),(1,200)
    # page:     page对象
    try:
        posts = paginator.page(current_page)
        # has_next              是否有下一页
        # next_page_number      下一页页码
        # has_previous          是否有上一页
        # previous_page_number  上一页页码
        # object_list           分页之后的数据列表
        # number                当前页
        # paginator             paginator对象
    except PageNotAnInteger:
        posts = paginator.page(1)
    except EmptyPage:
        posts = paginator.page(paginator.num_pages)
    return render(request, 'index.html', {'posts': posts})

views.py

下面说一下Django存在的不足,我们常见的翻页中都应该如下图

 

 变大的是当前页面,左右各有几个数字然后是上一页,和下一页

下面我们需要对Paginator进行一定的修改,所以我们可以重新写一个类,继承Paginator所有的方法,再增加新的方法用于实现显示数字的功能

class CustomPaginator(Paginator):
    def __init__(self,current_page,per_page_num,*args,**kwargs):
        # 当年页码
        self.current_page = int(current_page)
        # 最多显示页码的个数
        self.per_page_num = int(per_page_num)
        super(CustomPaginator,self).__init__(*args,**kwargs)

    def pager_num_range(self):
        # self.num_pages 表示总共有多少页
        # 情况1:当总页数小于我们要显示的页码个数
        if self.num_pages<self.per_page_num:
            return range(1,self.num_pages+1)
        part = int(self.per_page_num/2)
        # 情况2:我们需要显示10个页码,但是此时当前页为第2页,依旧显示1-10
        if self.current_page<=part:
            return range(1,self.per_page_num+1)
        # 情况3:我们需要显示10个页码,共有20页,但是此时当前页为第18页,依旧显示11-20
        if (self.current_page+part)>self.num_pages:
            return range(self.num_pages-self.per_page_num,self.num_pages+1)
        # 情况4:正常的中间情况
        return range(self.current_page-part,self.current_page+part+1)

def index1(req):
#内置的很多数据
# per_page: 每页显示条目数量
# count: 数据总个数
# num_pages:总页数
# page_range:总页数的索引范围,如: (1,10),(1,200)
# page: page对象(封装是否有下一页和上一页,如果有,就会得到下一页的页码
current_page = req.GET.get('p')
paginator = CustomPaginator(current_page,9,USER_LIST,10)
# Django自带的分页方法,传递USER_LIST即为所有的数据,
# 如果是使用数据库操作就可以直接写modles.Stundets.objuct.all()即可
try:
posts = paginator.page(current_page)
# posts 就是一个page对象
# has_next 是否有下一页
# next_page_number 下一页页码
# has_previous 是否有上一页
# previous_page_number 上一页页码
# object_list 分页之后的数据列表,已经完成切片的数据
# number 当前页
# paginator paginator对象(使之可以与Paginator对象可以进行相互转换)
except PageNotAnInteger:# 所输入的数据不是页码的情况
posts = paginator.page(1)
except EmptyPage: # 所输入的页码超过页码范围
posts = paginator.page(paginator.num_pages)
return render(req,'index1.html',{'posts':posts})

然后是对应的前端

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    <ul>
        {% for row in posts.object_list %}
            <li>{{ row.name }}*{{ row.age }}</li>
        {% endfor %}
    </ul>
    {% include 'include/pager.html' %}
{% if posts.has_previous %}
        <a href="/index1.html?p={{ posts.previous_page_number }}">上一页</a>
{#    {% else %}#}
{#        <a href="#">上一页</a>#}
    {% endif %}

{% for i in posts.paginator.pager_num_range %}
    {% if i == posts.number %}
        <a style="font-size: 20px" href="/index1.html?p={{ i }}">{{ i }}</a>
    {% else %}
        <a href="/index1.html?p={{ i }}">{{ i }}</a>
    {% endif %}
{% endfor %}

    {% if posts.has_next %}
        <a href="/index1.html?p={{ posts.next_page_number }}">下一页</a>
    {% else %}
        <a href="">下一页</a>
    {% endif %}

    <span>
        {{ posts.number }}/{{ posts.paginator.num_pages }}
    </span>
</html>

以上就是关于分页的所有内容。

 

posted @ 2020-10-12 20:39  崆峒山肖大侠  阅读(196)  评论(0编辑  收藏  举报