CRM客户关系管理系统(四)
kingadmin设计开发
4.4.根据list_display配置生成数据列表
(1)kingadmin/views.py

(2)kingadmin/templates/kingadmin/table_obj_list.html
通过自定义的admin_class类,循环出list_display所有的列

{#kingadmin/templates/kingadmin/table_obj_list.html#}
{% extends 'kingadmin/index.html' %}
{% block right-content-container %}
<h2 class="page-header">app</h2>
<div>
{{ querysets }}
<table class="table table-striped">
<thead>
<tr>
{% for column in admin_class.list_display %}
<th>{{ column }}</th>
{% endfor %}
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
{% endblock %}

(3)自定义模板标签
kingadmin下创建python package "templatetags",再新建kingadmin_tags.py
# kingadmin/templatetags/kingadmin_tags.py from django.template import Library
from django.utils.safestring import mark_safe register = Library() @register.simple_tag
def build_table_row(obj,admin_class):
'''生成一条记录的html element''' ele = ''
for column_name in admin_class.list_display:
#通过反射获取列的数据,两个参数,一个是object,一个是列名
column_data = getattr(obj,column_name)
td_ele = "<td>%s</td>"%column_data
ele += td_ele return mark_safe(ele)
(4)table_obj_list.html
首先要导入:{% load kingadmin_tags%}
然后使用自定义模板标签:<tr>{% build_table_row obj admin_class %}</tr>
使用的时候需要传两个参数进去
{#kingadmin/templates/kingadmin/table_obj_list.html#}
{% extends 'kingadmin/index.html' %}
{% load kingadmin_tags %}
{% block right-content-container %}
<h2 class="page-header">app</h2>
<div>
{{ querysets }}
<table class="table table-striped">
<thead>
<tr>
{% for column in admin_class.list_display %}
<th>{{ column }}</th>
{% endfor %}
</tr>
</thead>
<tbody>
{% for obj in querysets %}
<tr>{% build_table_row obj admin_class %}</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endblock %}
现在访问就可以看到对应列的数据了,但是status显示的是“0”,“1”,我们想要的是“未报名”,“已报名”,还有source,contact_tapy

(5)修改kingadmin_tags.py
因为有的字段有choices,有的字段没有choices,需要添加一个判断
models.CustomerInfo._meta.fields 获取model所有字段的对象
models.CustomerInfo._meta.get_field('status') 取一个字段的对象
get_xxxx_display 显示choices里面的值
# kingadmin/templatetags/kingadmin_tags.py from django.template import Library
from django.utils.safestring import mark_safe register = Library() @register.simple_tag
def build_table_row(obj,admin_class):
'''生成一条记录的html element''' ele = ''
for column_name in admin_class.list_display:
#获取所有字段对象
column_obj = admin_class.model._meta.get_field(column_name)
#字段对象的choices方法,如果有choices,则get_xxx_display
if column_obj.choices:
column_data = getattr(obj,'get_%s_display'%column_name)()
else:
column_data = getattr(obj,column_name) td_ele = "<td>%s</td>"%column_data
ele += td_ele return mark_safe(ele)
现在访问页面

4.5.添加过滤功能

(1)kingadmin/views.py
# kingadmin/templatetags/kingadmin_tags.py
import datetime from django.template import Library
from django.utils.safestring import mark_safe register = Library() @register.simple_tag
def build_filter_ele(filter_column,admin_class):
filter_ele = "<select name='%s'>"%filter_column
column_obj = admin_class.model._meta.get_field(filter_column)
try:
for choice in column_obj.get_choices():
option = "<option value='%s'>%s</option>"%choice
filter_ele += option except AttributeError as e:
#get_internal_type():获取字段属性
#因为时间的过滤方式是固定的(今天,过去七天,一个月.....),而不是从后台获取的
if column_obj.get_internal_type() in ('DateField','DateTimeField'):
time_obj = datetime.datetime.now()
time_list = [
['','--------'],
[time_obj,'Today'],
[time_obj - datetime.timedelta(7),'七天内'],
[time_obj.replace(day=1),'本月'],
[time_obj - datetime.timedelta(90),'三个月内'],
[time_obj.replace(month=1,day=1),'YearToDay(YTD)'], #本年
['','ALL'],
] for i in time_list:
option = "<option value='%s'>%s</option>" %(i[0],i[1])
filter_ele += option filter_ele += "</select>" return mark_safe(filter_ele)
(2)table_obj_list.html
<div>
<form>
{% for filter_column in admin_class.list_filter %}
{% build_filter_ele filter_column admin_class %}
{% endfor %}
<input type="submit" value="过滤">
</form>
</div>
访问页面


接下来把数据返回到前端
(3)kingadmin/views.py
def get_filter_result(request,querysets):
filter_conditions = {}
#获取过滤的字段
for key,val in request.GET.items():
if val:
filter_conditions[key] = val
#返回过滤后的数据
return querysets.filter(**filter_conditions),filter_conditions @login_required
def table_obj_list(request, app_name, model_name):
'''取出指定model里的数据返回给前端'''
#拿到admin_class后,通过它找到拿到model
admin_class = site.enable_admins[app_name][model_name]
querysets = admin_class.model.objects.all()
querysets,filter_conditions = get_filter_result(request,querysets)
admin_class.filter_conditions = filter_conditions
return render(request, 'kingadmin/table_obj_list.html',{'querysets':querysets,'admin_class':admin_class})
(4)kingadmin_tags.py
当选择过滤条件后,给对应值添加选中状态 selected=selected


现在通过时间过滤会报格式不正确的错误

修改时间过滤的格式

现在不报错了,但并没有过滤出数据

因为其它条件过滤的时候值是等于,但是根据时间过滤应该是大于等于才对

修改kingadmin_tags.py



CRM客户关系管理系统(四)的更多相关文章
- Django CRM客户关系管理系统
CRM需求分析 随着信息化时代带来的科技创新,CRM客户关系管理系统带来的效益在已经成为很多企业提高竞争优势的一分部,CRM客户关系管理系统将企业管理和客户关系管理集成到统一的平台,其系统功能主要体现 ...
- CRM客户关系管理系统-需求概设和详设
大概设计 大概设计就是对需求进行一个整体性分析,把需要实现的功能都列出来,对于客户关系管理系统,我们需要从角色出发,从而确定有哪些需求,最好是画个思维导图 首先我们是为培训学校这么一个场景来开发的,所 ...
- CRM 客户关系管理系统
CRM(Customer Relationship Manager)客户关系管理系统 企业为提高核心竞争力,利用相应的信息技术以及互联网技术协调企业与顾客间在销售.营销和服务上的交互,从而提升其管理方 ...
- CRM客户关系管理系统 北京易信软科信息技术有限公司
北京易信软科信息技术有限公司 推出大型erp系统,库存管理系统,客户关系管理系统,车辆登记管理系统,员工管理系统,采购管理系统,销售管理系统,为您的企业提供最优质的产品服务 北京易信软科您可信赖的北京 ...
- Django项目:CRM(客户关系管理系统)--84--74PerfectCRM实现CRM权限和权限组限制访问URL
#models.py # ————————01PerfectCRM基本配置ADMIN———————— from django.db import models # Create your models ...
- Django项目:CRM(客户关系管理系统)--85--75PerfectCRM实现CRM扩展权限
# sales_urls.py # ————————47PerfectCRM实现CRM客户报名流程———————— from django.conf.urls import url from bpm. ...
- Django项目:CRM(客户关系管理系统)--82--72PerfectCRM实现CRM动态菜单和角色
#models.py # ————————01PerfectCRM基本配置ADMIN———————— from django.db import models # Create your models ...
- Django项目:CRM(客户关系管理系统)--70--60PerfectCRM实现CRM学生上课记录
#urls.py """PerfectCRM URL Configuration The `urlpatterns` list routes URLs to views. ...
- Django项目:CRM(客户关系管理系统)--63--53PerfectCRM实现CRM客户报名流程缴费
#urls.py """PerfectCRM URL Configuration The `urlpatterns` list routes URLs to views. ...
- Django项目:CRM(客户关系管理系统)--58--48PerfectCRM实现CRM客户报名流程学生合同
# sales_urls.py # ————————47PerfectCRM实现CRM客户报名流程———————— from django.conf.urls import url from bpm. ...
随机推荐
- Python基础数据类型之集合以及其他和深浅copy
一.基础数据类型汇总补充 list 在循环一个列表时,最好不要删除列表中的元素,这样会使索引发生改变,从而报错(可以从后向前循环删除,这样不会改变未删元素的索引). 错误示范: lis = [,,, ...
- python打包压缩文件夹zip+组装文件夹
无意间想到的一个需求,然后就顺手写了写,留下来,方便以后用 列表版:(基本没用,仅提供思路,字典版稍微改动可以直接用) 大体需求: 把重复的文件名进行改名,达到浏览器下载相同文件的效果 下载完成后再把 ...
- highstaock+websocket实现动态展现
效果:从后台获取回测数据,在前端动态展现,和聚宽实现的回测效果相仿 大体思路:先传一个[[int,0],[int,0],[int,0],[int,0],[int,0],...]格式的死数据到前端渲染x ...
- poj 2945 Find the Clones
https://vjudge.net/problem/POJ-2945 题意: 给出n个长度相同的DNA序列,如果一个DNA序列出现过两次,那么就有说明它被复制了一次.问被复制0次,1次,2次--n- ...
- Iframe父页面与子页面之间的相互调用
iframe元素就是文档中的文档. window对象: 浏览器会在其打开一个HTML文档时创建一个对应的window对象.但是,如果一个文档定义了一个或者多个框架(即:包含一个或者多个frame或者i ...
- PHP 通过fsockopen函数获取远程网页源码
<?php $fp = fsockopen("www.baidu.com", 80, &$errno, &$errstr, 10); if(!$fp) { e ...
- 浮动和BFC的学习整理转述
前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! 文档流的概念:html中block块元素默认是单独占据一行的,从上到下排列,也就是我们说的文档流; 脱离文 ...
- Python3NumPy——数组(2)之数学空间与NumPy空间
0 介绍 本文承接上一篇,文章采用新的阐述方式,将数学中的表达与NumPy中的函数关联起来. 采用这种方式,可以直接建立数学表达与计算系统的对应关系,更易理解. 由于博客编写时间有限,每次尝试一个知识 ...
- 扩展第二屏幕发生Out Of Range及扩展后耳机没声音解决方案
新年好\(^o^)/~ 拓展屏幕这种事情.其实很简单的.无非就分辨率跟刷新频率.有时候一接好就可以了.有时候怎么也弄不出来.我也是搞了蛮久.昨天突然弄通了.小记一下说不定能帮到同需求人. [设备] 主 ...
- servlet与ajax数据交换(json格式)
JSON数据格式: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 易于人阅读和编写.同时也易于机器解析和生成. 它基于的一个子集. JSON采用完全独 ...