Django分页器和自定义分页器

Posted knighterrant

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django分页器和自定义分页器相关的知识,希望对你有一定的参考价值。

 

一.自定义分页器

 

import copy

class Pagination():
    def __init__(self,request,current_page,all_data_num,each_page_data_num=10,max_page_num=11):
        #封装页面相关数据
        ‘‘‘
        current_page:当前页
        data_num:数据总条数
        each_page:每页数据条数
        max_page_num:最大显示的页码数
        page_num: 总页数
       ‘‘‘
        self.url_data= copy.deepcopy(request.GET)
         # page =1&a=1&b=2

        try:
            current_page = int(current_page)
        except Exception as e:
            current_page = 1
        if current_page <1:
            current_page = 1


        self.current_page =current_page
        self.all_data_num = all_data_num  #100
        self.each_page_data_num =each_page_data_num  #
        self.max_page_num = max_page_num #总大显示的页码数
        # 计算总页数
        total_page_num,tmp = divmod(self.all_data_num,self.each_page_data_num)
        if tmp:
            total_page_num +=1
        self.total_page_num = total_page_num  #总页数

        self.page_count_half = int((self.max_page_num-1)/2)

    @property
    def start(self):
        return (self.current_page-1)*self.each_page_data_num

    @property
    def end(self):
        return self.current_page*self.each_page_data_num


    def page_html(self):
        #总页码 < 最大显示的页码数
        if self.total_page_num <self.max_page_num:
            page_start = 1
            page_end =self.total_page_num+1

        #总页码 > 最大显示的页码数
        else:

            if self.current_page <=self.page_count_half:
                page_start = 1
                page_end =self.max_page_num+1
            elif (self.current_page+self.page_count_half)>self.total_page_num:
                page_start=self.total_page_num-self.max_page_num+1
                page_end =self.total_page_num+1
            else:
                page_start =self.current_page-self.page_count_half
                page_end =self.current_page+self.page_count_half+1

        page_html_lst=[]

        #首页,上一页标签
        self.url_data["page"]=1
        frist_page =<nav aria-label="Page navigation"><ul class="pagination"><li><a href="?%s">首页</a></li>%(self.url_data.urlencode(),)
        page_html_lst.append(frist_page)
        self.url_data["page"] = self.current_page-1
        if self.current_page<=1:
            prev_page =<li class="disabled"><a href="#">上一页</a></li>
        else:
            prev_page = <li><a href="?%s">上一页</a></li>%(self.url_data.urlencode(),)
        page_html_lst.append(prev_page)

        #每页显示的页码

        for i in range(page_start,page_end):
            self.url_data["page"] = i
            if i == self.current_page:
                tmp =<li class="active"><a href="?%s">%s</a></li> % (self.url_data.urlencode(), i,)
            else:
                tmp =<li><a href="?%s">%s</a></li> % (self.url_data.urlencode(), i,)
            page_html_lst.append(tmp)

        self.url_data["page"] = self.current_page + 1
        if self.current_page >=self.total_page_num:
            next_page = <li class="disabled"><a href="#">下一页</a></li>
        else:
            next_page = <li><a href="?%s">下一页</a></li> % (self.url_data.urlencode(),)
        page_html_lst.append(next_page)
        self.url_data["page"] =self.total_page_num
        last_page = <li><a href="?%s">尾页</a></li></ul></nav> % (self.url_data.urlencode(),)
        page_html_lst.append(last_page)

        return "".join(page_html_lst)

自定义分页器的使用:

  该分页器依赖bootstrapt 的样式 

  pagination = Pagination(参数)

  1. 最关键的两个参数:

    1.当前页的页码          当前页码   reuqest.GET.get("page")

    2.以及需要分页的数据条数

  2. 该分页器 能做的:

    1. 将数据分好页,且 通过该类的两个属性 ,可以得到当前页的数据范围 总数据进行切片 [pagination.start:  pagination.end],得到当前页的数据,可以通过循环展示的页面。

    2. pagination.page_html() 该方法,实现页码展示效果

 二. Django 分页器的使用

1.批量创建数据 

批量创建数据
    book_list=[]
    for i in range(1,101):

        book=Book(name="book%s"%i,price=random.randint(100,900))

        book_list.append(book)

    Book.objects.bulk_create(book_list)

2.django 分页器的用法

  #django 分页器的使用

    #总数据
    book_lst=Book.objects.all()
#创建分页器对象 paginator = Paginator(book_lst,10) #参数 : 总数据,每页需要放的数据条数

print("总数据条数:",paginator.count) # 200 print("总共分了多少页:",paginator.num_pages) # 20 print("页码范围:",paginator.page_range) # range(1,21) page =paginator.get_page(3) #取第 3 页的数据 # paginator.get_page(n) 拿到第 n 页 的数据 # for book in page: # print(book) print("是否有下一页",page.has_next()) # 第3 页 有下一页 返回的是布尔值 :True print("是否有上一页",page.has_previous()) # 第 3 页有上一页 返回的是布尔值 :True print("下一页的数字:",page.next_page_number()) # 取到第3页的下一页数字4 print("上一页的数字:",page.previous_page_number()) #取第3页的上一页 数字 2

3. 实例

paginator =Paginator(data_list,10) 

1.设计思路: 

先从地址栏 发请求 的思路  开始考虑问题     http://127.0.0.1:8000/index/?page=3

地址栏  通过一个 page=1 的键值对 ,通过发get的请求给后端服务器, 后端通过 current_page=  request.GET.get("page")  得到需要看的page数

通过  page_data = paginator .get_page(current_page) ,然后前端通过循环page_data 展示客户需要看的那一页数据

2. 设计 显示页码

后端逻辑:

   
    book_list = Book.objects.all()
    paginator = Paginator(book_list,2)


    current_page=int(request.GET.get("page",1))
    page = paginator.get_page(current_page)

    #  如果页数十分多时,换另外一种显示方式 ,
    if paginator.num_pages>11:  #页面最多显示的页码数   11表示:需要显示的页面码总数 ,以及上一页,下一页,首页 ,尾页

        if current_page-5<1:
            page_range=range(1,12)
        elif current_page+5>paginator.num_pages:
            page_range=range(paginator.num_pages-10,paginator.num_pages+1)
        else:
            page_range=range(current_page-5,current_page+6)
    else:
        page_range=paginator.page_range
    return render(request,"index.html",{"page":page,"page_range":page_range,"current_page":current_page})

模板HTML

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css"
integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> </head> <body> <ul> {% for book in page %} <li>{{ book.title }}---{{ book.price }}</li> {% endfor %} </ul> <nav aria-label="Page navigation"> <ul class="pagination"> <li><a href="?page=1" aria-label="Previous"><span aria-hidden="true">首页</span></a></li> {% if page.has_previous %} <li><a href="?page={{ page.previous_page_number }}" aria-label="Previous"><span aria-hidden="true">上一页</span></a></li> {% else %} <li class="disabled"><a aria-label="Previous"><span aria-hidden="true">上一页</span></a></li> {% endif %} {% for num in page_range %} {% if num == current_page %} <li class="active"><a href="?page={{ num }}">{{ num }}</a></li> {% else %} <li><a href="?page={{ num }}">{{ num }}</a></li> {% endif %} {% endfor %} <li> <a href="#" > <span aria-hidden="true">下一页</span> </a> </li> <li> <a href="#" > <span aria-hidden="true">尾页</span> </a> </li> </ul> </nav> </body> </html>

 





以上是关于Django分页器和自定义分页器的主要内容,如果未能解决你的问题,请参考以下文章

分页器和版本控制

Django分页器及自定义分页器

Django自定义分页器

Django Ajax与自定义分页器

Django自定义分页器

分页器组件