Django项目:CRM(客户关系管理系统)--23--15PerfectCRM实现King_admin多条件过滤

登陆密码设置参考
http://www.cnblogs.com/ujq3/p/8553784.html

list_filter = ('source','consultant','consult_courses',)

list_filter = ('source','consultant','consult_courses',)

list_filter = () # 过滤器(可以包含ManyToManyField) (注意加 逗号 , )


{#table_data_list.html#}
{## ————————08PerfectCRM实现King_admin显示注册表的字段表头————————#}
{% extends 'king_master/king_index.html' %} {#继承模板#}
{% load kingadmin_tags %} {#通过自己定义标签获取中文,Django中利用filter与simple_tag为前端自定义函数的实现方法#}
{% block right-container-content %}
{#调用kingadmin_tags里的方法 获取 base_admin的值 #}
<h4>{% get_model_verbose_name admin_obj.model %}</h4>
{## ————————15PerfectCRM实现King_admin多条件过滤————————#}
{#判断 crm/kingadmin.py 里class CustomerAdmin(BaseAdmin):有没有使用list_filter = ('source',) #}
{% if admin_obj.list_filter %}
<div class="row">
<form>
{#循环 上面 list_filter = ('source',) 的字段 #}
{% for filter_column in admin_obj.list_filter %}
<div class="col-lg-1">{#最多12份 空间 #}
<div>{{ filter_column }}</div>
{#到后端取值,传参数到后端, kingadmin/templatetags/kingadmin_tags.py的def get_filter_field (filter_column,admin_obj): #}
<div>{% get_filter_field filter_column admin_obj %}</div>
</div>
{% endfor %}
<div>
<input type="submit" class="btn btn-success" value="过滤">
</div>
</form>
</div>
{% endif %}
{## ————————15PerfectCRM实现King_admin多条件过滤————————#}
<table class="table table-hover">
<thead>
<tr>
{#循环调用kingadmin/base_admin里的class BaseAdmin下的list_display = () 方法#}
{% for column in admin_obj.list_display %}
<th>{{ column }}</th>
{% endfor %}
</tr>
</thead>
{## ————————09PerfectCRM实现King_admin显示注册表的内容————————#}
<tbody>
{#循环调用kingadmin/views 里的def table_data_list下的admin_obj.querysets #}
{% for obj in admin_obj.querysets %}
<tr>
{#通过kingadmin_tags在后台处理 再传到前端 #}
{#调用kingadmin/templateags/kingadmin_tags 里的def build_table_row(admin_obj,obj):#}
{% build_table_row admin_obj obj %}
</tr>
{% endfor %}
</tbody>
{## ————————09PerfectCRM实现King_admin显示注册表的内容————————#}
</table>
{## ————————12PerfectCRM实现King_admin分页上下页————————#}
<div class="row">
<div class="pagination">
<span class="step-links">
{% if admin_obj.querysets.has_previous %}
{## ————————15PerfectCRM实现King_admin多条件过滤————————#}
{# <a href="?page={{ admin_obj.querysets.previous_page_number }}#}
<a href="?page={{ admin_obj.querysets.previous_page_number }}{% generate_filter_url admin_obj %}">上一页 </a>
{## ————————15PerfectCRM实现King_admin多条件过滤————————#}
{% endif %}
<span class="current">
第{{ admin_obj.querysets.number }}页,共{{ admin_obj.querysets.paginator.num_pages }}页
</span>
{% if admin_obj.querysets.has_next %}
{## ————————15PerfectCRM实现King_admin多条件过滤————————#}
{# <a href="?page={{ admin_obj.querysets.next_page_number }}#}
<a href="?page={{ admin_obj.querysets.next_page_number }}{% generate_filter_url admin_obj %}">下一页</a>
{## ————————15PerfectCRM实现King_admin多条件过滤————————#}
{% endif %}
</span>
</div>
</div>
{## ————————12PerfectCRM实现King_admin分页上下页————————#}
{## ————————13PerfectCRM实现King_admin分页页数————————#}
<nav aria-label="...">
<ul class="pagination">
<li class="disabled"></li>
{% for page in admin_obj.querysets.paginator.page_range %} {#循环 分页 范围#}
{% if page == admin_obj.querysets.number %} {#当前页高亮,否则不加高亮#}
<li class="active">
{% else %}
<li >
{% endif %}
{#后台拼接返回,kingadmin/templatetags/kingadmin_tags.py 里def generate_filter_url(admin_obj):#}
<a href="?page={{ page }}{% generate_filter_url admin_obj %}">{{ page }}</a>
</li>
{% endfor %}
</ul>
</nav>
{## ————————13PerfectCRM实现King_admin分页页数————————#}
{## ————————14PerfectCRM实现King_admin分页的省略显示————————#}
<div class="row panel-body">
<nav aria-label="...">
<ul class="pagination">
<!--如果有上一页-->
{% if admin_obj.querysets.has_previous %}
<li><a href="?page={{ admin_obj.querysets.previous_page_number }}{% generate_filter_url admin_obj %}"
aria-label="Previous"><span aria-hidden="true">«</span></a></li>
{% else %}
<li class="disabled">
<a href="#" aria-label="Previous"><span aria-hidden="true">«</span></a></li>
{% endif %}
<!--#分页的省略显示 kingadmin/templatetags/kingadmin_tags.py里def pag_omit(request,admin_obj):-->
{% pag_omit request admin_obj %}
<!--如果有下一页-->
{% if admin_obj.querysets.has_next %}
<li><a href="?page={{ admin_obj.querysets.next_page_number }}{% generate_filter_url admin_obj %}"
aria-label="Previous"><span aria-hidden="true">»</span></a></li>
{% else %}
<li class="disabled"><a href="#" aria-label="Previous"><span aria-hidden="true">»</span></a>
</li>
{% endif %}
</ul>
</nav>
</div>
{## ————————14PerfectCRM实现King_admin分页的省略显示————————#}
{% endblock %}
{## ————————08PerfectCRM实现King_admin显示注册表的字段表头————————#}
{#table_data_list.html#}


#kingadmin_tags.py # ————————06PerfectCRM实现King_admin注册功能获取内存优化处理———————— # # 因为前端禁止使用下划线开头(_meta.verbose_name ),所以通过后端处理后返回前端。
# from django import template #模板
# register = template.Library() #模板库
#
# @register.simple_tag #Django中利用filter与simple_tag为前端自定义函数的实现方法
# def get_app_name(model_obj):
#
# # ————————06PerfectCRM实现King_admin注册功能获取内存优化处理————————
# # return model_obj._meta.verbose_name_plural
# '''
# #判断 数据库 里如果有 verbose_name 或者 verbose_name_plural 就 调用 如果都没有 就使用默认的(英文)
# class Meta:
# verbose_name = "04客户信息表" #在 Django Admin 里 表名显示中文 但是会加s
# verbose_name_plural = "04客户信息表" #在 Django Admin 里 表名显示中文 不会加s
# '''
# model_name = model_obj._meta.verbose_name_plural if model_obj._meta.verbose_name else model_obj._meta.verbose_name_plural
# if not model_name:
# model_name = model_obj._meta.model_name
#
# return model_name
# ————————06PerfectCRM实现King_admin注册功能获取内存优化处理———————— # ————————06PerfectCRM实现King_admin注册功能获取内存优化处理———————— # ————————07PerfectCRM实现King_admin显示注册的表————————
#因为前端禁止使用下划线开头(_meta.verbose_name ),所以通过后端处理后返回前端。
from django import template #模板
register = template.Library() #模板库 @register.simple_tag #Django中利用filter与simple_tag为前端自定义函数的实现方法
def get_model_verbose_name(model_obj):
'''
#判断 数据库 里如果有 verbose_name 或者 verbose_name_plural 就 调用 如果都没有 就使用默认的(英文)
class Meta:
verbose_name = "04客户信息表" #在 Django Admin 里 表名显示中文 但是会加s
verbose_name_plural = "04客户信息表" #在 Django Admin 里 表名显示中文 不会加s
'''
model_name = model_obj._meta.verbose_name_plural if model_obj._meta.verbose_name else model_obj._meta.verbose_name_plural
if not model_name:
model_name = model_obj._meta.model_name
return model_name @register.simple_tag
def get_model_name(model_obj):
return model_obj._meta.model_name
@register.simple_tag
def get_app_name(model_obj):
return model_obj._meta.app_label
# ————————07PerfectCRM实现King_admin显示注册的表———————— # ————————09PerfectCRM实现King_admin显示注册表的内容————————
from django.utils.safestring import mark_safe #使用mark_safe函数标记后,django将不再对该函数的内容进行转义
@register.simple_tag
def build_table_row(admin_obj,obj):#通过kingadmin_tags在后台处理 再传到前端
row_ele = "" #为了生成一整行返回前端
if admin_obj.list_display:#如果不为空,有在crm/kingadmin.py注册site.register(models.Customer,CustomerAdmin)
#循环所有 要显示 的字符串 进行反射 展示 字段
for column in admin_obj.list_display: #循环base_admin里class BaseAdmin下list_display = ()
column_obj = obj._meta.get_field(column)#遍历获取 传进的参数对象 if column_obj.choices:#判断如果字段有choices属性
#获取choices的字符串(外健)
get_column_data = getattr(obj,"get_%s_display" % column) #反射,传进的参数对象,拼接字段
column_data = get_column_data()#函数,拿到数据
else:
column_data = getattr(obj, column)#反射,
# ————————10PerfectCRM实现King_admin日期优化————————
if type(column_data).__name__ == 'datetime':
column_data = column_data.strftime('%Y-%m-%d %H-%M-%S')
# ————————10PerfectCRM实现King_admin日期优化———————— td_ele = '''<td>%s</td>''' % column_data #把反射来的值 拼接字符串 生成<td>
row_ele += td_ele #把 <td> 拼接到上面到空字符串
else:
row_ele +="<td>%s</td>" %obj #把<td>拼接到上面到空字符串,crm/models.py里 def __str__(self):的返回值
return mark_safe(row_ele) #使用mark_safe函数标记后,django将不再对该函数的内容进行转义
# ————————09PerfectCRM实现King_admin显示注册表的内容———————— # ————————13PerfectCRM实现King_admin分页页数————————
#分页功能kingadmin/templates/kingadmin/table_data_list.html里 <a href="?page={{ page }}{% generate_filter_url admin_obj %}">{{ page }}
@register.simple_tag
def generate_filter_url(admin_obj): #拼接URL
url = ''
for k,v in admin_obj.filter_condtions.items():
url += "&%s=%s" %(k,v )
return url
# ————————13PerfectCRM实现King_admin分页页数———————— # ————————14PerfectCRM实现King_admin分页的省略显示————————
#分页的省略显示
@register.simple_tag
def pag_omit(request,admin_obj):#传入当前页面值
rest=''#大字符串 # ————————15PerfectCRM实现King_admin多条件过滤————————
filters = generate_filter_url(admin_obj) # 分页
# ————————15PerfectCRM实现King_admin多条件过滤———————— add_tags=False#标志位
for pages in admin_obj.querysets.paginator.page_range:
# 前两页 或 后 两页 或 当前页的前后页
if pages < 3 or pages>admin_obj.querysets.paginator.num_pages -2 or abs(admin_obj.querysets.number -pages) <=2:
#样式
add_tags=False
ele_class='' #颜色
if pages == admin_obj.querysets.number: #--如果是当前页码,颜色加深 不进链接跳转--
ele_class="active" #颜色加深 # ————————15PerfectCRM实现King_admin多条件过滤————————
# rest+='''<li class="%s"><a href="?page=%s">%s</a></li>'''%(ele_class,pages,pages) #--拼接URL--
rest+='''<li class="%s"><a href="?page=%s%s">%s</a></li>'''%(ele_class,pages,filters,pages) #--拼接URL--
# ————————15PerfectCRM实现King_admin多条件过滤————————
else: if add_tags==False:#如果不是标志位的页面
rest+='<li><a>...</a></li>'
add_tags=True#标志位为真 return mark_safe(rest) #使用mark_safe函数标记后,django将不再对该函数的内容进行转义 # ————————14PerfectCRM实现King_admin分页的省略显示———————— # ————————15PerfectCRM实现King_admin多条件过滤————————
#多条件过滤 table_data_list.html 传递参数
@register.simple_tag
def get_filter_field (filter_column,admin_obj):
print("admin obj",admin_obj.model ,filter_column)
field_obj = admin_obj.model._meta.get_field(filter_column)#调用内置方法
select_ele = """<select name="%s"> """ %filter_column #拼接成下拉框返回
for choice in field_obj.get_choices():#循环获取crm/models里class Customer(models.Model):下source_choices = ((0,'转介绍'),
selected_condtion = admin_obj.filter_condtions.get(filter_column)
if selected_condtion != None: #if None, 没有过滤这个条件
print("heoe....",filter_column,selected_condtion,type(selected_condtion))#类型是 整数
if selected_condtion == str(choice[0]): #就是选择的这个条件,整数转字符串
selected = "selected"
else:
selected = ""
else:
selected = "" #在前端把几个条件提交到后台,后台拿着条件变成一个字典,然后进行过滤,把数据返回前端,并且把条件作为字典返回后端,因为要在前端显示已经过滤的条件。
option_ele = """<option value="%s" %s>%s</option> """ % (choice[0],selected,choice[1])
select_ele +=option_ele
select_ele += "</select>"
return mark_safe(select_ele)
# ————————15PerfectCRM实现King_admin多条件过滤————————
#kingadmin_tags.py


#views # ————————02PerfectCRM创建ADMIN页面————————
from django.shortcuts import render # ————————04PerfectCRM实现King_admin注册功能————————
# from django import conf #配置文件
# print("dj conf:",conf) #配置文件
# print("dj conf:",conf.settings)#配置文件.设置
# ————————04PerfectCRM实现King_admin注册功能———————— # ————————04PerfectCRM实现King_admin注册功能————————
from king_admin import app_config #自动调用 动态加载类和函数
# ————————04PerfectCRM实现King_admin注册功能———————— # ————————04PerfectCRM实现King_admin注册功能————————
# from king_admin.base_admin import registered_sites # registered_sites={}
from king_admin import base_admin
# ————————04PerfectCRM实现King_admin注册功能———————— # ————————11PerfectCRM实现King_admin基本分页————————
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger # 分页功能
# ————————11PerfectCRM实现King_admin基本分页———————— def app_index(request):
# ————————04PerfectCRM实现King_admin注册功能————————
# for app in conf.settings.INSTALLED_APPS:
# print(app)#循环打印 配置文件.设置.安装应用程序#.Perfectcustomer\settings里的INSTALLED_APPS列表
# ————————04PerfectCRM实现King_admin注册功能———————— # ————————04PerfectCRM实现King_admin注册功能————————
# return render(request, 'king_admin/app_index.html')
# print("registered_sites",registered_sites)
# return render(request, 'king_admin/app_index.html')
# ————————04PerfectCRM实现King_admin注册功能———————— # ————————04PerfectCRM实现King_admin注册功能————————
# print("registered_sites", base_admin.registered_sites)
# return render(request, 'king_admin/app_index.html')
# ————————04PerfectCRM实现King_admin注册功能———————— # ————————05PerfectCRM实现King_admin注册功能获取内存————————
print("registered_sites",base_admin.site.registered_sites)
return render(request, 'king_admin/app_index.html', {"site": base_admin.site})
# ————————05PerfectCRM实现King_admin注册功能获取内存———————— # ————————02PerfectCRM创建ADMIN页面———————— # ————————13PerfectCRM实现King_admin分页页数————————
#处理def table_data_list(request,app_name,model_name):里的内容,
def filter_querysets(request,queryset):
condtions = {}
for k,v in request.GET.items():#不需要空的,判断是否为空
if k=="page":continue##kingadmin分页功能
# ————————15PerfectCRM实现King_admin多条件过滤————————
if v:
condtions[k] = v
# ————————15PerfectCRM实现King_admin多条件过滤————————
query_res = queryset.filter(**condtions)
return query_res,condtions
# ————————13PerfectCRM实现King_admin分页页数———————— # ————————08PerfectCRM实现King_admin显示注册表的字段表头————————
def table_data_list(request,app_name,model_name):
#通过2个参数到base_admin里获取class AdminRegisterException(Exception): 的对象
admin_obj = base_admin.site.registered_sites[app_name][model_name] #base_admin # ————————09PerfectCRM实现King_admin显示注册表的内容————————
admin_obj.querysets = admin_obj.model.objects.all()#取数据 传到 前端
# ————————09PerfectCRM实现King_admin显示注册表的内容———————— # ————————11PerfectCRM实现King_admin分页显示条数————————
# from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger # 分页功能#放在顶上导入
obj_list = admin_obj.model.objects.all()#取数据 传到 前端 #base_admin #获取传过来的所有对象 # ————————13PerfectCRM实现King_admin分页页数————————
queryset, condtions = filter_querysets(request, obj_list) #base_admin # 调用条件过滤
# ————————13PerfectCRM实现King_admin分页页数———————— # ————————15PerfectCRM实现King_admin多条件过滤————————
# paginator = Paginator(obj_list,admin_obj.list_per_page) #kingadmin里class CustomerAdmin(BaseAdmin):
paginator = Paginator(queryset, admin_obj.list_per_page)
# ————————15PerfectCRM实现King_admin多条件过滤———————— page = request.GET.get('page')
try:
objs = paginator.page(page) # 当前的页面的数据
except PageNotAnInteger:
# 如果页面不是一个整数,交付第一页。
objs = paginator.page(1)
except EmptyPage:
# 如果页面的范围(例如9999),交付最后一页的搜索结果。
objs = paginator.page(paginator.num_pages)
admin_obj.querysets = objs # base_admin # ————————13PerfectCRM实现King_admin分页页数————————
admin_obj.filter_condtions = condtions # base_admin
# ————————13PerfectCRM实现King_admin分页页数———————— # ————————11PerfectCRM实现King_admin分页显示条数———————— return render(request,"king_admin/table_data_list.html",locals())
# ————————08PerfectCRM实现King_admin显示注册表的字段表头————————
#views

Django项目:CRM(客户关系管理系统)--23--15PerfectCRM实现King_admin多条件过滤的更多相关文章
- 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(客户关系管理系统)--58--48PerfectCRM实现CRM客户报名流程学生合同
# sales_urls.py # ————————47PerfectCRM实现CRM客户报名流程———————— from django.conf.urls import url from bpm. ...
- Django项目:CRM(客户关系管理系统)--32--24PerfectCRM实现King_admin自定义操作数据
#admin.py # ————————01PerfectCRM基本配置ADMIN———————— from django.contrib import admin # Register your m ...
- Django项目:CRM(客户关系管理系统)--31--23PerfectCRM实现King_admin数据删除
登陆密码设置参考 http://www.cnblogs.com/ujq3/p/8553784.html # king_urls.py # ————————02PerfectCRM创建ADMIN页面—— ...
- Django项目:CRM(客户关系管理系统)--69--59PerfectCRM实现king_admin行内编辑
#base_admin.py # ————————24PerfectCRM实现King_admin自定义操作数据———————— from django.shortcuts import render ...
- Django项目:CRM(客户关系管理系统)--67--57PerfectCRM实现admin批量生成上课记录
#admin.py # ————————01PerfectCRM基本配置ADMIN———————— from django.contrib import admin # Register your m ...
- Django项目:CRM(客户关系管理系统)--65--55PerfectCRM实现CRM客户报名状态颜色变化
# kingadmin.py # ————————04PerfectCRM实现King_admin注册功能———————— from crm import models #print("ki ...
- Django项目:CRM(客户关系管理系统)--64--54PerfectCRM实现CRM客户报名链接
# kingadmin.py # ————————04PerfectCRM实现King_admin注册功能———————— from crm import models #print("ki ...
随机推荐
- Shuffle过程详解
- JavaScript特效源码(1、文字特效)
注:本文以及以下关于Javascript特效源码都是分享自JavaScript源码大全. 1.逐隐逐现的的特效 逐隐逐现的文字特效[推荐使用][适用于IE4++] (修改显示的文字后根据说明进行共2步 ...
- LUOGU P1453 城市环路(基环树+dp)
传送门 解题思路 一道基环树上$dp$的题,这种题比较套路吧,首先第一遍$dfs$把环找出来,然后对于环上的每一个点都向它子树内做一次树形$dp$,$f[i][0/1]$表示到了$i$这个点选或不选的 ...
- springboot与任务(异步任务)
描述:在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在Spring 3.x ...
- 我喜欢Mouding
我Smily喜欢Mouding
- js 实现页面局部(或图片)放大功能(vue)
方法: adjustStart1 (e) { e.preventDefault() let event = e.touches if (event.length === 2) { this.style ...
- 左神算法书籍《程序员代码面试指南》——1_01设计一个有getMin功能的栈
[题目] 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作. [要求] 1.pop.push.getMin操作的时间复杂度都是O(1).2.设计的栈类型可以使用现成的栈结构. ...
- ElasticSearch入门介绍之会当凌绝顶(一)
ElasticSearch也是一款非常优秀的开源的全文检索框架,以大名鼎鼎的Apache Lucene为基础,高度封装了更丰富,易用的API,同时与Apache Solr一样,提供了非常强大的分布式集 ...
- #iOS问题记录# 频繁触发viewDidLayoutSubviews的问题
问题描述: 最近使用给Flutter团队写view组件的时候,出现了触发Widget的频繁build的问题. 问题排查: Flutter的同事提到在flutter层,是因为 updateViewpor ...
- [Swoole系列入门教程 3] 心跳检测
一.Swoole 的4大知识点: 1.TCP/UDP服务器 2.微服务 3.协程 二.同步与异步: 同步买奶茶:小明点单交钱,然后等着拿奶茶: 异步买奶茶:小明点单交钱,店员给小明一个小票,等小明奶茶 ...