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

    django中封装的分页器有很多我们的需求想加但是加不上,这也就是我们自定义分页器的原因

    1.model中创建我们需要的表---Book

    2.进行数据库迁移

    输入:

    makemigrations
    migrate
    之后在我们项目目录下会出现这样一个数据库

    打开最右侧的Datebase 把数据库拖进去就好了

    3.批量的插入数据

    book_list=[]
    #插入100条数据
        for i in range(100):
        book=Book(title="book_%s"%i,price=i*i)
            book_list.append(book)
    
        Book.objects.bulk_create(book_list)

    ok!前期工作完成,上重头器!!!

    
    

    1.首先在views中创建路由

    2.创建视图函数

    3.新建一个page.py文件,里边放着我们的·自定义分页器的逻辑和代码

    4.views

    views
    #引用我们的自定义分页器
    from app01.model import Pagination
    #用户看到的页数
    current_page_num = request.GET,get("page")
    #查询表的数据
    book_list = Book.objects.all()
    #                               当前的页码               数据的总共个数
    paginstion=Paginston(current_page_num,book_list.count(),request)
    #进行数据的切片,哪到哪显示在一个页码上
    book_list = book_list [pagination.start:paginstion.end]
    #直接返回页面
    return rander(request,"index.html",locals())

    5.htnl

    index.html
    #引用bootstrap
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
    
    <body>
    #数据的总体显示
    <ul>
        {% for book in book_list %}
        <li>{{ book.title }} ---- {{ book.price }}</li>
        {% endfor %}
    </ul>
    
    #书籍进行分页之后的效果,注意的是    {{ pagination.page_html|safe }}
    <nav aria-label="Page navigation">
        <ul class="pagination">
        {{ pagination.page_html|safe }}
    </ul>
    </nav>
    </body>
    #这样,一个总体的数据就显示在页面上了

    6.page.py文件中的逻辑和代码最为重class Pagination(object):

     

    def __init__(self, current_page_num, all_count, request,per_page_num=2, pager_count=11):
            """
            封装分页相关数据
            :param current_page_num: 当前访问页的数字
            :param all_count:    分页数据中的数据总条数
            :param per_page_num: 每页显示的数据条数
            :param pager_count:  最多显示的页码个数
            """
           '''
          进行判断,如果输入的是字符串捕获之后整回第一页
           '''
        try:
          current_page_num=int(current_page_num)
        except Exception as e:
          current_page_num=1
            
            """
            如果输入的是别的字符或者<1,直接给他第一页数据
            """
        if current_page_num <1:
          current_page_num=1    
        
            #进行数据的实例化
        self.current_page_num = current_page_num  
        self.all_count = all_count
        self.per_page_num = per_page_num
    
            #计算实际的总页码   商和余  (divmod是内置函数)
            all_pager,tmp = divmod(all_count,per_page_num)
            if tmp:
                all_count = all_count+1
            self.all_pager = all_pager
    
            self.pager_count = pager_count
         #选择当前页数显示左边显示5个右边显示5个36* self.pager_count_half
    = int((pager_count - 1)/2) #保存搜索条件,deepcopy深拷贝,可以添加节点 import copy self.params = copy.deepcopy(request.GET) ''' 起始页和结束也的判断 如果用户在4页,显示的数据应该是30---40 也就是:current_page_num - 1 * per_page_num ''' @property def start(self): return (self.current_page_num - 1) * self.per_page_num @property def end(self): return self.current_page_num * self.per_page_num def page_html(self): # 如果总页码 < 11个: if self.all_pager <= self.pager_count: # 默认显示就是第一页 pager_start = 1 pager_end = self.all_pager + 1 # 总页码 > 11 else: # 当前页如果<=页面上最多显示11/2个页码 if self.current_page_num <= self.pager_count_half: pager_start = 1 pager_end = self.pager_count + 1 # 当前页大于5 else: # 页码翻到最后 if (self.current_page_num + self.pager_count_half) > self.all_pager: pager_start = self.all_pager - self.pager_count + 1 pager_end = self.all_pager + 1 else: pager_start = self.current_page_num - self.pager_count_half pager_end = self.current_page_num + self.pager_count_half + 1 page_html_list = [] first_page = '<li><a href="?page=%s">首页</a></li>' % (1,) page_html_list.append(first_page) # 判断是否有上一页 当前页面是1 那就是等于了,等于就设置 class="disabled" 不让选中 # 否则的话就是正常显示 给参数 下一页就是当前页数 - 1 if self.current_page_num <= 1: prev_page = '<li class="disabled"><a href="#">上一页</a></li>' else: prev_page = '<li><a href="?page=%s">上一页</a></li>' % (self.current_page_num - 1,) page_html_list.append(prev_page) for i in range(pager_start, pager_end): self.params["page"] = i # 如果等钱页面等于选中的页面 + class="active" 显示颜色,否则的话就是正常显示 if i == self.current_page_num: temp = '<li class="active"><a href="?%s">%s</a></li>' % (self.params.urlencode(), i) else: temp = '<li><a href="?%s">%s</a></li>' % (self.params.urlencode(), i,) page_html_list.append(temp) # 判断是否有下一页 当前页面是8 总页数也是8 那就是等于了,等于就设置 class="disabled" 不让选中 # 否则的话就是正常显示 给参数 下一页就是当前页数 + 1 if self.current_page_num >= self.all_pager: next_page = '<li class="disabled"><a href="#">下一页</a></li>' else: next_page = '<li><a href="?page=%s">下一页</a></li>' % (self.current_page_num + 1,) page_html_list.append(next_page) last_page = '<li><a href="?page=%s">尾页</a></li>' % (self.all_pager,) page_html_list.append(last_page) return ''.join(page_html_list)
  • 相关阅读:
    Oracle/PLSQL: RTRIM Function-from cyber
    Oracle/PLSQL: LTRIM Function-from cyber
    Oracle AnyData Data Type Version 11.1-from cyber
    用 Sqlplus 创建用户的详细步骤 (centos 6.0,Oracle 11g)
    SQL_Plus操作命令-引自网络
    Linux下scp的用法-引自网络
    非学习型单层感知机的java实现(日志三)
    N维法向量与N维超平面的关系的简单证明(日志二)
    R语言分析(二)——薛毅R语言第二章后面习题解析
    R语言分析(一)-----基本语法
  • 原文地址:https://www.cnblogs.com/lzqrkn/p/9925603.html
Copyright © 2011-2022 走看看