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', '')) #获取当前页码数
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',''), 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
}, )

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

  1. crm 系统项目(三) 业务

    1. 项目背景 crm系统是某教育平台正在使用的项目,系统主要为 销售部.运营部.教质部门提供管理平台,随着公司规模的扩展,对公司员工的业务信息量化以及信息化建设越来越重要. crm系统为不同角色的用 ...

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

    crm 系统项目(二) admin 后台操作表格 1. app下创建 templates  运行的时候 先找全局的templates——> 按照app的注册顺序找templates中的文件 2. ...

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

    crm 系统项目(一) 登录,注册,校验 首先创建一个Django项目,关于配置信息不多说,前面有~ models.py文件下创建需要的表格信息,之后导入数据库 from django.db impo ...

  4. Java高级项目实战03:CRM系统数据库设计

    接上一篇:Java高级项目实战02:客户关系管理系统CRM系统模块分析与介绍 欢迎点击回顾,接下来我们说说 CRM系统数据库设计. 我们根据产品的原型搞以及UI组的设计稿, 接下来就要设计数据库, 一 ...

  5. Java高级项目实战02:客户关系管理系统CRM系统模块分析与介绍

    本文承接上一篇:Java高级项目实战之CRM系统01:CRM系统概念和分类.企业项目开发流程 先来CRM系统结构图: 每个模块作用介绍如下: 1.营销管理 营销机会管理:针对企业中客户的质询需求所建立 ...

  6. Java高级项目实战之CRM系统01:CRM系统概念和分类、企业项目开发流程

    1. CRM系统介绍 CRM系统即客户关系管理系统, 顾名思义就是管理公司与客户之间的关系. 是一种以"客户关系一对一理论"为基础,旨在改善企业与客户之间关系的新型管理机制.客户关 ...

  7. 三分钟了解B2B CRM系统的特点

    最近很多朋友想了解什么是B2B CRM系统,说到这里小Z先来给大家说说什么是B2B--B2B原本写作B to B,是Business-to-Business的缩写.正常来说就是企业与企业之间的生意往来 ...

  8. CRM系统新思维

    客户关系管理系统(CRM系统)是管理公司当前以及未来潜在客户的系统,其主要目的是通过优化客户关系实现公司销售业绩的长期增长,它是企业信息系统的核心之一.目前,移动互联网.大数据以及人工智能技术发展日新 ...

  9. Django CRM系统

    本节内容 业务痛点分析 项目需求讨论 使用场景分析 表结构设计 业务痛点分析 我2013年刚加入老男孩教育的时候,学校就一间教室,2个招生老师,招了学生后,招生老师就在自己的excel表里记录一下,每 ...

随机推荐

  1. NFS学习

    linux下搭建nfs服务: NFS是network filesystem的缩写,它可以通过网络,让不同的机器.不同的操作系统共享文件. NFS支持的功能比较多,默认端口也是随机的,基于远程调用服务( ...

  2. C#实现简单的串口通信

    前言 本着学习研究的态度,用c#语言实现简单的串口通信工具. 一.串口通信原理 串口通信 串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节.尽管比 ...

  3. BZOJ 3674 可持久化并查集加强版(按秩合并版本)

    /* bzoj 3674: 可持久化并查集加强版 http://www.lydsy.com/JudgeOnline/problem.php?id=3674 用可持久化线段树维护可持久化数组从而实现可持 ...

  4. Spring JDBC模板类—org.springframework.jdbc.core.JdbcTemplate(转)

    今天看了下Spring的源码——关于JDBC的"薄"封装,Spring 用一个Spring JDBC模板类来封装了繁琐的JDBC操作.下面仔细讲解一下Spring JDBC框架. ...

  5. Cache index coloring for virtual-address dynamic allocators

    A method for managing a memory, including obtaining a number of indices and a cache line size of a c ...

  6. 洛谷—— P1457 城堡 The Castle

    https://www.luogu.org/problem/show?pid=1457 题目描述 我们憨厚的USACO主人公农夫约翰(Farmer John)以无法想象的运气,在他生日那天收到了一份特 ...

  7. NHibernate之旅(14):探索NHibernate中使用视图

    本节内容 引入 1.持久化类 2.映射文件 3.測试 结语 引入 在数据库操作中,我们除了对表操作,还有视图.存储过程等操作,这一篇和下篇来学习这些内容.这篇我们来学习怎样在NHibernate中使用 ...

  8. POJ 1236 Network of Schools 强连通图

    Description A number of schools are connected to a computer network. Agreements have been developed ...

  9. UI各种小控件的用法

    今天给大家列举出来UI中的一些小控件的用法.方便大的学习与使用 一些方法和属性我们能够查看API文档.不必将每一个控件的功能都记住, 由于在使用的过程中,我们能够查看API文档.方便使用,我们仅仅要记 ...

  10. 婚礼上的谎言(C++实现)

    #include<iostream> using namespace std; void main(void) { int a,b,c; char DD,EE,FF; for (a=1;a ...