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

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

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

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

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

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

4. 自定义方法
多对多:

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

自定义显示HTML代码:

  1. from django.utils.safestring import mark_safe
  2.  
  3. def show_status(self):
  4.  
  5. status_color = {
  6.  
  7. 'signed': 'green',
  8. 'unregistered': '#208c72',
  9. 'studying': 'yellow',
  10. 'paid_in_full': 'blue',
  11. }
  12.  
  13. return mark_safe('<span style="background-color: {};color: white;padding: 2px">{}</span>'.format(
  14. status_color.get(self.status), self.get_status_display()))

前端应用

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

2. 分页

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

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

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

  1. users = [{'name': 'alex{}'.format(i), 'pwd': ''} for i in range(1, 302)]
  2.  
  3. def fycustomer_list(request):
  4. # Customer_all=models.Customer.objects.all()
  5. '''
  6. 第一页 0 20
  7. 第2页 20 40
  8. n (n-1)*20 开始 20*n结尾
  9. >>> divmod(9,2)
  10. (4, 1)
  11. >>> divmod(9,2)[0]
  12. 4
  13. >>> divmod(9,2)[1]
  14. 1
  15. '''
  16. try:
  17. page_num = int(request.GET.get('page', ''))
  18. if page_num <= 0:
  19. page_num = 1
  20. except Exception as e: # 输入字符串也等于一
  21. page_num = 1
  22. per_num = 10
  23. # 总数量
  24. all_count = len(users)
  25. # 总页码数 除分页数
  26. page_count, more = divmod(all_count, per_num)
  27. if more: # 如果有余数就+1页
  28. page_count += 1
  29. # 最大页码数 获取的页面除二减去 用于开头
  30. max_show = 11
  31. half_show = max_show // 2
  32. # #7-5
  33. # page_start=page_num-half_show
  34. # page_end=page_num+half_show #7+5
  35. # 总页码数 < 最大显示页码数
  36. if page_count < max_show:
  37. page_start = 1
  38. page_end = page_count
  39. else:
  40. # 处理左边极值
  41. # 当前页小于等于一半
  42. if page_num <= half_show:
  43. page_start = 1
  44. page_end = max_show
  45. # 当前的数 +页码的一半 大于页码数
  46. elif page_num + half_show >= page_count:
  47. page_start = page_count - max_show + 1
  48. page_end = page_count
  49. else:
  50. page_start = page_num - half_show # 7-5 11的一半
  51. page_end = page_num + half_show # 7 + 5 12
  52.  
  53. page_list = []
  54. if page_num == 1: # 第一页选的页码page_num
  55. page_list.append('<li class="disabled"><a>上一页</a></li>')
  56. else:
  57. page_list.append('<li><a href="?page={}">上一页</a></li>'.format(page_num - 1, )) # 点击上一页-1
  58. # print('aaaaa', page_start)
  59.  
  60. for i in range(page_start, page_end + 1):
  61. if i == page_num:
  62. page_list.append('<li class="active"><a href="?page={}">{}</a></li>'.format(i, i)) # 等于就激活当前页面 其他继续显示
  63. else:
  64. page_list.append('<li><a href="?page={}">{}</a></li>'.format(i, i))
  65.  
  66. if page_num == page_count:
  67. page_list.append('<li class="disabled"><a>下一页</a></li>')
  68. else:
  69. page_list.append('<li><a href="?page={}">下一页</a></li>'.format(page_num + 1, )) # 点击下一页+1
  70.  
  71. page_html = ''.join(page_list)
  72.  
  73. return render(request, 'user_list.html', {'users': users[(page_num - 1) * per_num:per_num * page_num],
  74. 'page_html': page_html})

html

  1. <table class="table table-hover table-bordered">
  2. {% for user in users %}
  3. <tr>
  4. <td>{{ user.name }}</td>
  5. <td>{{ user.pwd }}</td>
  6. </tr>
  7. {% endfor %}
  8. </table>
  9.  
  10. <nav aria-label="Page navigation">
  11. <ul class="pagination">
  12. {{ page_html|safe }}
  13. </ul>
  14. </nav>

封装成类

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

  1. class Pagination:
  2. #当前页面数 总页码数 显示页码数 最大分页数
  3. def __init__(self, page_num, all_count, per_num=10, max_show=11):
  4. # 获取页码
  5. try:
  6. self.page_num = int(page_num)
  7. if self.page_num <= 0:
  8. self.page_num = 1
  9. except Exception as e:
  10. self.page_num = 1
  11.  
  12. # 每页显示的数据量
  13. self.per_num = per_num
  14.  
  15. # 总数据量
  16. all_count = all_count
  17.  
  18. # 总页码数
  19. self.page_count, more = divmod(all_count, per_num)
  20. if more:
  21. self.page_count += 1
  22.  
  23. # 最大显示页码数
  24. self.max_show = max_show
  25. self.half_show = max_show // 2
  26.  
  27. @property
  28. def page_html(self):
  29. # 总页码数 < 最大显示页码数
  30. if self.page_count < self.max_show:
  31. page_start = 1
  32. page_end = self.page_count
  33. else:
  34. # 处理左边极值
  35. if self.page_num <= self.half_show:
  36. page_start = 1
  37. page_end = self.max_show
  38. elif self.page_num + self.half_show >= self.page_count:
  39. page_start = self.page_count - self.max_show + 1
  40. page_end = self.page_count
  41. else:
  42. page_start = self.page_num - self.half_show #
  43. page_end = self.page_num + self.half_show # 7 + 5 12
  44.  
  45. page_list = []
  46. if self.page_num == 1:
  47. page_list.append('<li class="disabled"><a>上一页</a></li>')
  48. else:
  49. page_list.append('<li><a href="?page={}">上一页</a></li>'.format(self.page_num - 1, ))
  50.  
  51. for i in range(page_start, page_end + 1):
  52. if i == self.page_num:
  53. page_list.append('<li class="active"><a href="?page={}">{}</a></li>'.format(i, i))
  54. else:
  55. page_list.append('<li><a href="?page={}">{}</a></li>'.format(i, i))
  56.  
  57. if self.page_num == self.page_count:
  58. page_list.append('<li class="disabled"><a>下一页</a></li>')
  59. else:
  60. page_list.append('<li><a href="?page={}">下一页</a></li>'.format(self.page_num + 1, ))
  61.  
  62. return ''.join(page_list)
  63.  
  64. @property
  65. def start(self):
  66. """
  67. 切片的起始值
  68. :return:
  69. """
  70. return (self.page_num - 1) * self.per_num
  71.  
  72. @property#封装成属性
  73. def end(self):
  74. """
  75. 切片的终止值
  76. :return:
  77. """
  78. return self.page_num * self.per_num

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

创建middlewares  添加 auth.py

  1. from django.utils.deprecation import MiddlewareMixin
  2. from crm import models
  3. from django.shortcuts import redirect, reverse
  4. class AuthMiddleware(MiddlewareMixin):
  5. def process_request(self, request):
  6. if request.path_info in [reverse('login'), reverse('reg')]:#白名单
  7. return
  8. if request.path_info.startswith('/crm/admin/'):
  9. return
  10. pk = request.session.get('pk')
  11. user = models.UserProfile.objects.filter(pk=pk).first()
  12. # 没有登录 跳转至登录页面
  13. if not user:
  14. return redirect(reverse('login'))
  15. 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. Page Cache与Page回写

    综述 Page cache是通过将磁盘中的数据缓存到内存中,从而减少磁盘I/O操作,从而提高性能.此外,还要确保在page cache中的数据更改时能够被同步到磁盘上,后者被称为page回写(page ...

  2. mysql 将一个表中的数据复制到另一个表中,sql语句

    1.表结构相同的表,且在同一数据库(如,table1,table2) Sql :insert into table1 select * from table2 (完全复制) insert into t ...

  3. mysql删除表中重复数据,只保留一个最小的id的记录

    语句: delete from table1 where id not in (select minid from (select min(id) as minid from table1 group ...

  4. 【学习】Linux Shell脚本编程

    1.脚本的组成和执行 Linux shell脚本的结构并不复杂,其主要由变量.内部命令以及shell的语法结构和一些函数.其他命令行的程序等组成,以下是一个简单的shell脚本. #!/bin/bas ...

  5. Cs231n-assignment 1作业笔记

    KNN assignment1 KNN讲解参见: https://blog.csdn.net/u014485485/article/details/79433514?utm_source=blogxg ...

  6. windows下安装MongoDB扩展和配置

    windows下安装MongoDB扩展和配置 1.下载mongoDB扩展,根据当前php版本进行下载 地址如下:http://pecl.php.net/package/mongo 我本地php版本是 ...

  7. AnyDesk远程连接及异常处理

    远程协助工具,用得最普遍的非QQ莫属,毕竟用户量在这里摆着的.不过,用户体验效果还不太理想,你懂得.接下来分享两个工具,一个是TeamViewer,另一个是AnyDesk.你更倾向于哪一款呢? 一.T ...

  8. 基于SVM的鸢尾花数据集分类实现[使用Matlab]

    iris数据集的中文名是安德森鸢尾花卉数据集,英文全称是Anderson’s Iris data set.iris包含150个样本,对应数据集的每行数据.每行数据包含每个样本的四个特征和样本的类别信息 ...

  9. odoo11 访问MSQL Server等第三发数据源

    odoo框架默认的访问时Postgres数据库,但在实际的应用场景中,不可避免的使用到其他数据库,所以有必要研究如何连接其他第三方数据库,这里分享下OCA的相关模块,具体的源代码在这里. 我将第三方的 ...

  10. SpringBoot整合RabbitMQ-服务安装

    本系列是学习SpringBoot整合RabbitMQ的练手,包含服务安装,RabbitMQ整合SpringBoot2.x,消息可靠性投递实现等三篇博客. 学习路径:https://www.imooc. ...