zoukankan      html  css  js  c++  java
  • 自定义分页器

    具体请点击老男孩视频:B站

    简单直接,上代码!!

    1. 在项目的根目录下新建一个包(带有__init__.py文件的文件夹),或者直接将下面的pagenation包复制到你的项目中
    2. 新建一个py文件,如:pagenation.py
    3. 导入组件 mark_safe
    4. 自定义类 

    from django.utils.safestring import mark_safe
    
    
    class Pagenation:
        def __init__(self, request, all_count, max_show=11, per_num=10):
            '''
            :param request: request对象
            :param all_count: 总数据量
            :param base_url: 路径
            :param max_show: 最多显示的页码数
            :param per_num: 每页显示的数据条数
            '''
    
            # 基本的url
            self.base_url = request.path_info
    
            # 当前页码
            try:
                self.current_page = int(request.GET.get('page', 1))
                if self.current_page <= 0:
                    self.current_page = 1
    
            except Exception as e:
                self.current_page = 1
    
            # 最多显示的页码数
            self.max_show = max_show
            half_show = max_show // 2
    
            # 每页显示的数据条数
            self.per_num = per_num
    
            # 总数据量
            self.all_count = all_count
    
            # 总页码数
            self.total_num, more = divmod(all_count, per_num)
            if more:
                self.total_num += 1
    
            # 总页码数小于最大显示数,显示总页码数
            if self.total_num <= max_show:
                self.page_start = 1
                self.page_end = self.total_num
            else:
                # 总页码数大于最大显示数,最多显示11个
                if self.current_page <= half_show:
                    self.page_start = 1
                    self.page_end = max_show
                elif self.current_page + half_show >= self.total_num:
                    self.page_end = self.total_num
                    self.page_start = self.total_num - max_show + 1
                else:
                    self.page_start = self.current_page - half_show
                    self.page_end = self.current_page + half_show
    
        @property
        def start(self):
            '''
            :return: start page
            '''
            return (self.current_page - 1) * self.per_num
    
        @property
        def end(self):
            '''
            :return:end page
            '''
            return self.current_page * self.per_num
    
        @property
        def show_li(self):
            # 存放 li 代码
            html_list = []
    
            if self.current_page == 1:
                first_li = '<li class="disabled"><a>首页</a></li>'
            else:
                first_li = '<li><a href="{0}?page=1">首页</a></li>'.format(self.base_url)
    
            html_list.append(first_li)
    
            if self.current_page == 1:
                prev_li = '<li class="disabled"><a> << </a></li>'
            else:
                prev_li = '<li><a href="{1}?page={0}"> << </a></li>'.format(self.current_page - 1,
                                                                            self.base_url)
            html_list.append(prev_li)
    
            for num in range(self.page_start, self.page_end + 1):
                if self.current_page == num:
                    li_html = '<li class="active"><a href="{1}?page={0}">{0}</a></li>'.format(num, self.base_url)
                else:
                    li_html = '<li><a href="{1}?page={0}">{0}</a></li>'.format(num, self.base_url)
                html_list.append(li_html)
            if self.current_page == self.total_num:
                next_li = '<li class="disabled"><a> >> </a></li>'
            else:
                next_li = '<li><a href="{1}?page={0}"> >> </a></li>'.format(self.current_page + 1,
                                                                            self.base_url)
            html_list.append(next_li)
            if self.current_page == self.total_num:
                last_li = '<li class="disabled"><a>末页</a></li>'
            else:
                last_li = '<li><a href="{1}?page={0}">末页</a></li>'.format(self.total_num, self.base_url)
            html_list.append(last_li)
    
            return mark_safe(''.join(html_list))
    pagenation.py

    使用时,在你的py文件(如:views.py)中导入该文件

    from pagenation.pagenation import Pagenation
    
    
    def index(request):
    
        # 数据
        book_list = models.Book.objects.all()
    
        # 分页
        page = Pagenation(request, book_list.count())
    
        return render(request, 'index.html', {
            # [page.start: page.end] 切片操作
            'data': book_list[page.start:page.end],
    
            # 将html_str返回给前端页面展示
            'html_str': page.show_li
        })
    

    前端展示

    {# 分页器 #}
    <div class="text-center">
        <nav aria-label="Page navigation">
            <ul class="pagination">
                {#将后端返回的html_str渲染展示到页面#}
                {{ html_str }}
            </ul>
        </nav>
    </div>
    

    显示效果如下

  • 相关阅读:
    内核开发特点
    制作 patch
    sdram flash 区别
    数组名 函数名
    Html标签见解——关于position问题分组总结
    Html标签见解——margin和padding使用过程中所谓的bug问题《一》
    HTML标签见解——img
    关于float和clear
    业内杂谈——你认识“用户体验”吗?
    css控制窗口上下水平居中方案详解
  • 原文地址:https://www.cnblogs.com/rongge95500/p/10072136.html
Copyright © 2011-2022 走看看