zoukankan      html  css  js  c++  java
  • crm 系统项目(三) 自动分页

    crm 系统项目(三) 自动分页

    需求:

      1. 做一个自动分页, 每15条数据1页

      2. 让当前页数在中间显示

      3. 上一页, 下一页

    注意情况:

      1.总页数 小于 规定显示的页数

      2. 左右两边极值情况

      3. 前后端传参,交互 

      

    user_list.py

    {% extends 'layout.html' %}
    
    {% block content %}
    
    
        <table class="table table-bordered table-hover">
            <thead>
            <tr>
                <th>序号</th>
                <th>用户名</th>
                <th>密码</th>
    
            </tr>
            </thead>
            <tbody>
            {% for user in all_user %}
                <tr>
                    <td>{{ forloop.counter }}</td>
                    <td>{{ user.name }}</td>
                    <td>{{ user.pwd }}</td>
                </tr>
            {% endfor %}
    
            </tbody>
        </table>
        <nav aria-label="Page navigation">
      <ul class="pagination">
        {{ page_html|safe }}
      </ul>
    </nav>
    {% endblock %}
    urls.py

     

    views.py

    userlist= [{'name':'傻傻的兆满{}号'.format(i),'pwd':'帅帅的灰灰{}号'.format(i)} for i in range(1,667)]
    
    def user_list(request):
        try:
            page = int(request.GET.get('page', '1'))    #获取当前页码数
            if page <= 0:
                page = 1
        except Exception as e:
            page = 1
        print(page)
    
        per_num = 15    # 每页显示的数据
        all_count = len(userlist)   #总的数据量
        page_num, more = divmod(all_count, per_num) #商和余数
        if more:
            page_num += 1
        max_show = 11   #最多显示的分页数
        half_show = max_show // 2   #当前页码左面和右面各多少个,
    
        if page_num < max_show:
            page_start = 1
            page_end = page_num
        else:
            if page <= half_show:
                page_start = 1
                page_end = max_show
            elif page + half_show > page_num:
                page_start = page_num - max_show + 1
                page_end = page_num
            else:
                page_start = page - half_show
                page_end = page + half_show
    
            start = (page - 1) * per_num
            end = page * per_num
    
        li_list = []    # 将分配好的页码,放入列表
        if page == 1:
            li_list.append('<li class="disabled" ><a> << </a></li>')
        else:
            li_list.append('<li ><a href="?page={}"> << </a></li>'.format(page - 1))
    
        for i in range(page_start, page_end + 1):
            if page == i:
                li_list.append('<li class="active"><a href="?page={}">{}</a></li>'.format(i, i))
            else:
                li_list.append('<li><a href="?page={}">{}</a></li>'.format(i, i))
    
        if page == page_num:
            li_list.append('<li class="disabled" ><a> >> </a></li>')
        else:
            li_list.append('<li ><a href="?page={}"> >> </a></li>'.format(page + 1))
    
        page_html = ''.join(li_list)    #列表变成字符串
        return render(request, 'user_list.html', {'all_user': userlist[start:end],
                                                  'page_num': range(page_start, page_end + 1),
                                                  'page_html': page_html},)
    views.py

    为了方便实用可以把整个分页封装起来, 

      在app下新建文件 paginationg.py

      封装分页功能

    # 封装分页
    class Pagination:
    
        def __init__(self, page, all_count, per_num=15, max_show=11):
            try:
                page = int(page)
                if page <= 0:
                    page = 1
            except Exception as e:
                page = 1
            self.page = page
            self.all_count = all_count
            self.per_num = per_num
            self.max_show = max_show
            # 总页码数
            self.page_num, more = divmod(all_count, per_num)
            if more:
                self.page_num += 1
            # 最多显示页码数
            half_show = max_show // 2
    
            if self.page_num < max_show:
                # 总页码数不够 最大显示页码数
                self.page_start = 1
                self.page_end = self.page_num
            else:
                # 能显示超过最大显示页码数
                if page <= half_show:
                    # 处理左边的极值
                    self.page_start = 1
                    self.page_end = max_show
                elif page + half_show > self.page_num:
                    # 处理右边的极值
                    self.page_start = self.page_num - max_show + 1
                    self.page_end = self.page_num
                else:
                    # 正常的情况
                    self.page_start = page - half_show
                    self.page_end = page + half_show
    
        @property
        def start(self):
            return (self.page - 1) * self.per_num
    
        @property
        def end(self):
            return self.page * self.per_num
    
        @property
        def page_html(self):
            li_list = []
            if self.page == 1:
                li_list.append('<li class="disabled" ><a> << </a></li>')
            else:
                li_list.append('<li ><a href="?page={}"> << </a></li>'.format(self.page - 1))
    
            for i in range(self.page_start, self.page_end + 1):
                if self.page == i:
                    li_list.append('<li class="active"><a href="?page={}">{}</a></li>'.format(i, i))
                else:
                    li_list.append('<li><a href="?page={}">{}</a></li>'.format(i, i))
    
            if self.page == self.page_num:
                li_list.append('<li class="disabled" ><a> >> </a></li>')
            else:
                li_list.append('<li ><a href="?page={}"> >> </a></li>'.format(self.page + 1))
    
            return ''.join(li_list)
    paginationg.py

    viewa.py下直接传参调用

    # 调用封装好的分页
    from app1.utils.paginationg import Pagination
    def user_list(request):
        pager = Pagination(request.GET.get('page','1'), len(user_list), per_num=10, max_show=15)
        return render(request, 'user_list.html',
                      {"all_user": userlist[pager.start:pager.end],
                       'page_html': pager.page_html
                       }, )
    View Code

     

  • 相关阅读:
    windows下mysql数据库导入导出
    比较两个数组,根据id删除相同的对象
    angular子组件给父组件传值
    angular父组件给子组件传值
    angular获取dom节点
    angular创建服务
    forEach和for包含异步调用的区别
    用某种符号或字符替换某些字符
    嵌套函数和闭包
    JavaScript 递归
  • 原文地址:https://www.cnblogs.com/konghui/p/10138687.html
Copyright © 2011-2022 走看看