CRM客户关系管理系统(四)

时间:2021-11-22 02:37:57

kingadmin设计开发

4.4.根据list_display配置生成数据列表

(1)kingadmin/views.py

CRM客户关系管理系统(四)

(2)kingadmin/templates/kingadmin/table_obj_list.html

通过自定义的admin_class类,循环出list_display所有的列

CRM客户关系管理系统(四)

{#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 %}

CRM客户关系管理系统(四)

(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

CRM客户关系管理系统(四)

(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)

现在访问页面

CRM客户关系管理系统(四)

4.5.添加过滤功能

CRM客户关系管理系统(四)

(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>

访问页面

CRM客户关系管理系统(四)

CRM客户关系管理系统(四)

接下来把数据返回到前端

(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

CRM客户关系管理系统(四)

CRM客户关系管理系统(四)

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

CRM客户关系管理系统(四)

修改时间过滤的格式

CRM客户关系管理系统(四)

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

CRM客户关系管理系统(四)

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

CRM客户关系管理系统(四)

修改kingadmin_tags.py

CRM客户关系管理系统(四)

CRM客户关系管理系统(四)

CRM客户关系管理系统(四)