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
                   }, )

原文地址:https://www.cnblogs.com/konghui/p/10138687.html

时间: 2024-10-09 18:04:00

crm 系统项目(三) 自动分页的相关文章

crm 系统项目(一) 登录,注册,校验

crm 系统项目(一) 登录,注册,校验 首先创建一个Django项目,关于配置信息不多说,前面有~ models.py文件下创建需要的表格信息,之后导入数据库 from django.db import models from multiselectfield import MultiSelectField course_choices = (('Linux', 'Linux中高级'), ('PythonFullStack', 'Python高级全栈开发'),) class_type_choi

crm 系统项目(二) admin 后台操作表格

crm 系统项目(二) admin 后台操作表格 1. app下创建 templates  运行的时候 先找全局的templates——> 按照app的注册顺序找templates中的文件 2. app下在创建一个urls.py include() 3. 创建超级用户 python manage.py createsuperuser 邮箱可以忽略,密码默认为8位 4. 在admin中注册model from django.contrib import admin from crm import

项目三. 基于图像压缩的视频监控系统

项目三. 基于图像压缩的视频监控系统 Sprint0-产品设计与规划 基于图像压缩的视频监控系统 1. 产品功能演示 在linux系统上运行程序,弹出登录界面,输入地址.端口信息,弹出视频监控界面,实时传出视频信息. 2. 功能模块分析 采集端: 图像采集子系统 图像编码子系统 传输子系统 主程序 监控端: 传输子系统 图像编码子系统 传输子系统 主程序 Sprint1-基于Epoll架构的采集端程序框架设计 第1课-Epoll机制精通 大纲: v  为什么用Epoll? 阻塞型IO与多路复用

Java高级项目实战之CRM系统用户登录功能实现

用户登录功能后台代码实现: UserMapper接口查询方法定义 /** * * @param userName * @param userPwd * @param roleName * 查询用户记录 * @return */ User queryUser(@Param("userName")String userName); <!-- 查询用户 --> <select id="queryUser" resultMap="BaseResu

使用NoSQL实现高并发CRM系统实践(源代码+解析)

又想速度快,又要大数据,又要保证数据不出错,还要拥抱变化,改需求的时候不那么痛苦,特别是字段的调整,按照以前的做法,想想就头疼.使用NoSQL,简直就是随心所欲,再奇葩的数据结构,处理起来也很容易.下面看我如何用NoSQL数据库实现高并发,高可靠的CRM系统. 1.前言 随着facebook.微博等WEB2.0互联网网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本

中润云服:“天下没有免费的CRM系统”

"天下没有免费的CRM系统",一定有很多人会反驳,因为到百度上搜搜就知道有很多,这是怎么回事呢?今天来和大家说说这个免费CRM系统到底是怎么回事. 一.销售策略 有不少CRM系统厂商都能提供免费试用产品,供企业实际体验一下软件的功能.这种免费试用,一般都可以体验该软件所有的功能,但只能个人试用,不同人员间的信息无法共享,并且一般都会有时间期限的.不难看出,这种免费只是一种免费试用,是CRM厂商开拓市场,吸引客户的一种手段而已. 二.仅提供单机版的免费CRM系统 这种单机版的CRM系统对

我们为什么追捧浪潮PS Cloud的CRM系统?

CRM  (客户关系管理)似乎是当下的一个热词,能够为企业提供全方位.多角度的管理视觉,赋予企业更完善的客户交流能力,最大化客户的收益与发展.因此,我们可以把CRM所关注的内容概括为三句话,即客户的盈利性.客户满意度.客户忠诚度.目前,小最受大众追捧和欢迎的的CRM软件当属浪潮PS Cloud的CRM. 浪潮PS Cloud是中国首款基于微服务架构的开源云ERP产品,采用SaaS模式,提供涵盖协同研发.产业链协同.智能制造.财务共享.人力资源.数字营销等10000 多个应用,即插即用,支持多终端

身处智能行业的你,真的了解CRM系统吗?

提到企业的核心竞争力就不得不提到CRM系统,一个好的CRM是一个智能科技企业所必须的,可以帮助企业在客户管理层面来提高客户的实际价值,提升客户的满意度,提高客户的忠诚度,以及客户的持续购买力,特别是让销售管理层面的销售周期缩短,并且在此基础上面有效的控制和降低成本. 那么一套好的CRM系统应该具备什么样的性质?一.客户管理首先作为一套系统,特别是一个管理系统必须要具备客户管理,也是CRM系统的基本.在客户的基础资料,交易明细,与企业的往来邮件更或者是商业信息都能进行统一的管理,在保证业务进展的连

CRM系统:从战略到实施

CRM系统的成功实施早在技术购买之前就开始了.从包含流程调整.团队构建和变更管理的蓝图开始,这一点很重要.这些基本元素将有助于确保您的CRM软件解决方案得到最大程度的采用和业务收益. 制定正确的CRM实施路径 在CRM的实施过程中,良好的开发方法是CRM软件项目成功实施的保障, CRM六个阶段论就是其中的一种.具体而言: 第一阶段,总体规划.该阶段应对企业的现状进行诊断,分析客户的问题,寻找商业机会,确定实施目标,预算等,并在此基础上进行基于全局的规划. 第二阶段,立项启动.包括如何组织项目的工