1. 数据的展示
数据通过ORM查询出来 对象列表 QuerySet

1. 普通的字段
对象.字段名 ——》 数据库中的值

<td>{{ customer.phone }}</td>

2. choices
((1,'男'))
对象.字段名 ——》 数据库中的值 1
对象.get_字段名_display() ——》 数据库中的值对应的显示值 男

 <td>{{ customer.get_source_display }}</td>

3. 外键
对象.外键 ——》 关联的对象 定义 __str__ __repr__
对象.外键.字段名

4. 自定义方法
多对多:

#显示自定义已报班级
在models.py中
def show_class(self):
return ' | '.join([str(i) for i in self.class_list.all()])
<td>{{ customer.show_class }}</td>

自定义显示HTML代码:

from django.utils.safestring import mark_safe

def show_status(self):

status_color = {

'signed': 'green',
'unregistered': '#208c72',
'studying': 'yellow',
'paid_in_full': 'blue',
} return mark_safe('<span style="background-color: {};color: white;padding: 2px">{}</span>'.format(
status_color.get(self.status), self.get_status_display()))

前端应用

<td>{{ customer.show_status }}</td>

2. 分页

总的是思想 就是 拿到总页面数除分页数 得到做大页面数,对最大页面数 进行判断规定显示几个页面

具体算法 如最大页面数是11 除余2 得到5  如我当前页数是7 就用7-5得到开头 7+5等于结尾

2                    12    =10    因为开头2也算就11

users = [{'name': 'alex{}'.format(i), 'pwd': ''} for i in range(1, 302)]

def fycustomer_list(request):
# Customer_all=models.Customer.objects.all()
'''
第一页 0 20
第2页 20 40
n (n-1)*20 开始 20*n结尾
>>> divmod(9,2)
(4, 1)
>>> divmod(9,2)[0]
4
>>> divmod(9,2)[1]
1
'''
try:
page_num = int(request.GET.get('page', ''))
if page_num <= 0:
page_num = 1
except Exception as e: # 输入字符串也等于一
page_num = 1
per_num = 10
# 总数量
all_count = len(users)
# 总页码数 除分页数
page_count, more = divmod(all_count, per_num)
if more: # 如果有余数就+1页
page_count += 1
# 最大页码数 获取的页面除二减去 用于开头
max_show = 11
half_show = max_show // 2
# #7-5
# page_start=page_num-half_show
# page_end=page_num+half_show #7+5
# 总页码数 < 最大显示页码数
if page_count < max_show:
page_start = 1
page_end = page_count
else:
# 处理左边极值
# 当前页小于等于一半
if page_num <= half_show:
page_start = 1
page_end = max_show
# 当前的数 +页码的一半 大于页码数
elif page_num + half_show >= page_count:
page_start = page_count - max_show + 1
page_end = page_count
else:
page_start = page_num - half_show # 7-5 11的一半
page_end = page_num + half_show # 7 + 5 12 page_list = []
if page_num == 1: # 第一页选的页码page_num
page_list.append('<li class="disabled"><a>上一页</a></li>')
else:
page_list.append('<li><a href="?page={}">上一页</a></li>'.format(page_num - 1, )) # 点击上一页-1
# print('aaaaa', page_start) for i in range(page_start, page_end + 1):
if i == page_num:
page_list.append('<li class="active"><a href="?page={}">{}</a></li>'.format(i, i)) # 等于就激活当前页面 其他继续显示
else:
page_list.append('<li><a href="?page={}">{}</a></li>'.format(i, i)) if page_num == page_count:
page_list.append('<li class="disabled"><a>下一页</a></li>')
else:
page_list.append('<li><a href="?page={}">下一页</a></li>'.format(page_num + 1, )) # 点击下一页+1 page_html = ''.join(page_list) return render(request, 'user_list.html', {'users': users[(page_num - 1) * per_num:per_num * page_num],
'page_html': page_html})

html

    <table class="table table-hover table-bordered">
{% for user in users %}
<tr>
<td>{{ user.name }}</td>
<td>{{ user.pwd }}</td>
</tr>
{% endfor %}
</table> <nav aria-label="Page navigation">
<ul class="pagination">
{{ page_html|safe }}
</ul>
</nav>

封装成类

创建文件 utils  创建python文件pagination.py

class Pagination:
#当前页面数 总页码数 显示页码数 最大分页数
def __init__(self, page_num, all_count, per_num=10, max_show=11):
# 获取页码
try:
self.page_num = int(page_num)
if self.page_num <= 0:
self.page_num = 1
except Exception as e:
self.page_num = 1 # 每页显示的数据量
self.per_num = per_num # 总数据量
all_count = all_count # 总页码数
self.page_count, more = divmod(all_count, per_num)
if more:
self.page_count += 1 # 最大显示页码数
self.max_show = max_show
self.half_show = max_show // 2 @property
def page_html(self):
# 总页码数 < 最大显示页码数
if self.page_count < self.max_show:
page_start = 1
page_end = self.page_count
else:
# 处理左边极值
if self.page_num <= self.half_show:
page_start = 1
page_end = self.max_show
elif self.page_num + self.half_show >= self.page_count:
page_start = self.page_count - self.max_show + 1
page_end = self.page_count
else:
page_start = self.page_num - self.half_show #
page_end = self.page_num + self.half_show # 7 + 5 12 page_list = []
if self.page_num == 1:
page_list.append('<li class="disabled"><a>上一页</a></li>')
else:
page_list.append('<li><a href="?page={}">上一页</a></li>'.format(self.page_num - 1, )) for i in range(page_start, page_end + 1):
if i == self.page_num:
page_list.append('<li class="active"><a href="?page={}">{}</a></li>'.format(i, i))
else:
page_list.append('<li><a href="?page={}">{}</a></li>'.format(i, i)) if self.page_num == self.page_count:
page_list.append('<li class="disabled"><a>下一页</a></li>')
else:
page_list.append('<li><a href="?page={}">下一页</a></li>'.format(self.page_num + 1, )) return ''.join(page_list) @property
def start(self):
"""
切片的起始值
:return:
"""
return (self.page_num - 1) * self.per_num @property#封装成属性
def end(self):
"""
切片的终止值
:return:
"""
return self.page_num * self.per_num

关于 用户登陆 需要 session 认证  可以写个中间件 进行全局变量

创建middlewares  添加 auth.py

from django.utils.deprecation import MiddlewareMixin
from crm import models
from django.shortcuts import redirect, reverse
class AuthMiddleware(MiddlewareMixin):
def process_request(self, request):
if request.path_info in [reverse('login'), reverse('reg')]:#白名单
return
if request.path_info.startswith('/crm/admin/'):
return
pk = request.session.get('pk')
user = models.UserProfile.objects.filter(pk=pk).first()
# 没有登录 跳转至登录页面
if not user:
return redirect(reverse('login'))
request.user_obj = user

crm 数据展示 和分页思想(一)的更多相关文章

  1. layui数据表格使用(一:基础篇,数据展示、分页组件、表格内嵌表单和图片)

    表格展示神器之一:layui表格 前言:在写后台管理系统中使用最多的就是表格数据展示了,使用表格组件能提高大量的开发效率,目前主流的数据表格组件有bootstrap table.layui table ...

  2. ASP.NET MVC 数据分页思想及解决方案代码

    作为一个程序猿,数据分页是每个人都会遇到的问题.解决方案更是琳琅满目,花样百出.但基本的思想都是差不多的. 下面给大家分享一个简单的分页器,让初学者了解一下最简单的分页思想,以及在ASP.NET MV ...

  3. Android 仿淘宝头条竖直跑马灯式新闻标题及“分页思想

    在淘宝App的首页中间位置,有一块小小的地方在不知疲倦地循坏滚动着头条标题(见下图的红框区域),这样的设计无疑能够在有限的手机屏幕上展示更丰富的内容.而实现这一功能需要用到的控件就是我在上一篇文章中提 ...

  4. Jqgrid入门-结合Struts2+json实现数据展示(五)

    DEMO用的是ssh框架实现的,具体怎么搭建的就不多做说明了.分页表格的数据操作难点就是数据展现.至于增删改直接用hibernate原生的方法实现即可.         初步分析:表格要实现分页,那么 ...

  5. MVC模式下的数据展示:EasyUI的datagrid

    我的数据库设计是一张老师表teacher,一张学生表student,一个教师对应多个学生,在学生一方建立外键; 还有一点想清楚,需要展示的数据是根据什么来的,是成功登陆的用户的id?还是直接展示所有的 ...

  6. 在DevExpress程序中使用PopupContainerEdit和PopupContainer实现数据展示

    在一些数据的即时查询场景中,我们可能需要对输入信息进行模糊查询并进行选择,例如在一些文本输入场景,如输入某个站点编码或者设备编码,然后获取符合的列表供用户选择的场景,本篇随笔介绍在DevExpress ...

  7. PHP读取文件夹数据,并分页

    protected function read_all ($dir){ // 确保目录有权限进入 if(!is_dir($dir)) return false; $handle = opendir($ ...

  8. 手把手教你写带登录的NodeJS爬虫+数据展示

    其实在早之前,就做过立马理财的销售额统计,只不过是用前端js写的,需要在首页的console调试面板里粘贴一段代码执行,点击这里.主要是通过定时爬取https://www.lmlc.com/s/web ...

  9. django学习-27.admin管理后台里:对列表展示页面的数据展示进行相关优化

    目录结构 1.前言 2.完整的操作步骤 2.1.第一步:查看ModelAdmin类和BaseModelAdmin类的源码 2.2.第二步:查看表animal对应的列表展示页面默认的数据展示 2.3.第 ...

随机推荐

  1. Java 集合系列(三)—— LinkedList

    以脑图的形式来展示Java集合知识,让零碎知识点形成体系 LinkedList    LinkedList是一种可以在任何位置进行高效地插入和删除操作的有序序列.   它的最基本存储结构是一个节点:每 ...

  2. LeetCode算法题-Array Partition I(Java实现)

    这是悦乐书的第262次更新,第275篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第129题(顺位题号是561).给定一个2n个整数的数组,你的任务是将这些整数分组为n对 ...

  3. Python开发【前端篇】HTML5+CSS3

    CSS权重 CSS权重指的是样式的优先级,有两条或多条样式作用于一个元素,权重高的那条样式对元素起作用,权重相同的,后写的样式会覆盖前面写的样式. 权重的等级 可以把样式的应用方式分为几个等级,按照等 ...

  4. 解析Object.defineProperty的作用

    对象是由多个名/值对组成的无序的集合.对象中每个属性对应任意类型的值. 定义对象可以使用构造函数或字面量的形式: 除了以上添加属性的方式,还可以使用Object.defineProperty定义新属性 ...

  5. [LeetCode] 10. 正则表达式匹配

    题目链接:https://leetcode-cn.com/problems/regular-expression-matching/ 题目描述: 给定一个字符串 (s) 和一个字符模式 (p).实现支 ...

  6. SQL SERVER数据库修改是否区分大小写(转载)

    昨天去客户,发现程序无法应用,跟踪错误提示,提示的大致意思是“数据库表名和数据库字段名不存在”.查询后发现是SQL Server数据库设置了区分大小写的缘故(一般安装时,Oracle的正确安装下是默认 ...

  7. SoapUI 学习总结-01 环境配置

    遇到的问题 1,怎么SoapUI的Request URL不支持大写怎么办? 问题:在SoapUI的Request URL中,每次输入的URL中含有的大写字母会自动转换为小写字母,导致请求不了对应的地址 ...

  8. Asp.Net Core SignalR 与微信小程序交互笔记

    什么是Asp.Net Core SignalR Asp.Net Core SignalR 是微软开发的一套基于Asp.Net Core的与Web进行实时交互的类库,它使我们的应用能够实时的把数据推送给 ...

  9. JS/JQuery 设置input等标签设置和取消只读属性

    <input type="text" id="HouseName" value="" align="left"/& ...

  10. json文件格式详解

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 易于人阅读和编写.同时也易于机器解析和生成. 它基于JavaScript Programming Lan ...