• 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>

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

  • 相关阅读:
    css3回顾 checkbox
    mysql在linux下的安装
    LNMP(linux+nginx+mysql+php)服务器环境配置
    linux下如何查看某软件是否已安装
    Linux查看系统信息的一些命令及查看已安装软件包的命令
    正确配置nginx和php
    服务器搭建:手把手教你配置web服务之nginx1
    搭配环境一(手动搭建,重要!!)
    安装配置nginx
    nginx配置参数中文详解
  • 原文地址:https://www.cnblogs.com/xiaoyaotx/p/13805129.html
Copyright © 2020-2023  润新知