Django项目:CRM(客户关系管理系统)--26--18PerfectCRM实现King_admin搜索关键字-LMLPHP

search_fields = ('name','qq',)

Django项目:CRM(客户关系管理系统)--26--18PerfectCRM实现King_admin搜索关键字-LMLPHP

登陆密码设置参考

http://www.cnblogs.com/ujq3/p/8553784.html

Django项目:CRM(客户关系管理系统)--26--18PerfectCRM实现King_admin搜索关键字-LMLPHP

Django项目:CRM(客户关系管理系统)--26--18PerfectCRM实现King_admin搜索关键字-LMLPHP

search_fields = ('name','qq',)

Django项目:CRM(客户关系管理系统)--26--18PerfectCRM实现King_admin搜索关键字-LMLPHP

search_fields = () #搜索(不能包含CharField)(注意加 逗号 , )
 #base_admin.py
# ————————04PerfectCRM实现King_admin注册功能———————— #Django admin 注册功能的形式
# sites = {
# 'crm':{
# 'customers':CustomerAdmin,
# 'customerfollowup':CustomerFollowUPAdmin,
# }
# } class AdminRegisterException(Exception): #自定义异常
def __init__(self,msg):
self.message = msg class BaseAdmin(object):#自定义方法
list_display = () #显示的字段(不能包含ManyToManyField) # ————————11PerfectCRM实现King_admin分页显示条数————————
list_per_page = 10 # 默认分页条数10
# ————————11PerfectCRM实现King_admin分页显示条数———————— # ————————15PerfectCRM实现King_admin多条件过滤————————
list_filter = () # 过滤器(可以包含ManyToManyField) (注意加 逗号 , )
# ————————15PerfectCRM实现King_admin多条件过滤———————— # ————————18PerfectCRM实现King_admin搜索关键字————————
search_fields = () #搜索(不能包含CharField)(注意加 逗号 , )
# ————————18PerfectCRM实现King_admin搜索关键字———————— # ————————05PerfectCRM实现King_admin注册功能获取内存————————
class AdminSite(object):
def __init__(self):
self.registered_sites = {} #传到views 里调用
def register(self,model,admin_class=None): #默认值None 使用 BaseAdmin
app_name = model._meta.app_label#用内置方法获取 APP名字 (crm)
model_name = model._meta.model_name#用内置方法获取 表名 (Customer)
if app_name not in self.registered_sites:
self.registered_sites[app_name] = {} #创建 crm={}
if model_name in self.registered_sites[app_name]:
raise AdminRegisterException("app [%s] model [%s] has already registered!异常"
%(app_name,model_name))#自定义异常,
if not admin_class:
admin_class = BaseAdmin #默认值None 使用 BaseAdmin
# self.registered_sites[app_name][model_name] = admin_class #注册APP
# site = AdminSite() # 实例化类 单例模式 # ————————05PerfectCRM实现King_admin注册功能获取内存————————
#registered_sites {'crm': {'customer': <class 'crm.kingadmin.CustomerAdmin'>, 'courserecord': <class 'kingadmin.base_admin.BaseAdmin'>}}
#把类名放到class的对象里,然后通过class的对象传到前端
# admin_class.model = model
# self.registered_sites[app_name][model_name] = admin_class #注册APP
#
# site = AdminSite() #实例化类 单例模式
# ————————05PerfectCRM实现King_admin注册功能获取内存———————— # ————————06PerfectCRM实现King_admin注册功能获取内存优化处理————————
#没有实例化会使用同一个内存地址
admin_obj = admin_class() #先实例化
admin_obj.model = model #参数赋值给实例
self.registered_sites[app_name][model_name] = admin_obj#注册APP
#实例化后,调用会使用不同的内存地址 site = AdminSite() #实例化类 单例模式
# ————————06PerfectCRM实现King_admin注册功能获取内存优化处理———————— # registered_sites={}
# def register(model,admin_class=None): #默认值None 使用 BaseAdmin
# app_name = model._meta.app_label#用内置方法获取 APP名字 (crm)
# model_name = model._meta.model_name#用内置方法获取 表名 (Customer)
# if app_name not in registered_sites:
# registered_sites[app_name] = {} #创建 crm={}
# if model_name in registered_sites[app_name]:
# raise AdminRegisterException("app [%s] model [%s] has already registered!异常"
# %(app_name,model_name))#自定义异常
# if not admin_class:
# admin_class = BaseAdmin #默认值None 使用class BaseAdmin
# registered_sites[app_name][model_name] = admin_class #注册APP # ————————05PerfectCRM实现King_admin注册功能获取内存———————— # ————————04PerfectCRM实现King_admin注册功能————————

#base_admin.py

Django项目:CRM(客户关系管理系统)--26--18PerfectCRM实现King_admin搜索关键字-LMLPHP

Django项目:CRM(客户关系管理系统)--26--18PerfectCRM实现King_admin搜索关键字-LMLPHP

 {#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> {## ————————17PerfectCRM实现King_admin单列排序————————#}
<div>
{# 隐藏 #} {# 过滤后排序功能 #}
<input type="hidden" name="_o" value="{% get_current_orderby_key request %}">
</div>
{## ————————17PerfectCRM实现King_admin单列排序————————#} {## ————————18PerfectCRM实现King_admin搜索关键字————————#}
<hr> {#过滤后搜索功能1#} {## 搜索框里保留搜索值 #}
{# <input type="text" name="_q" value="{% get_search_key request %}">#} <div class="row">
<div class="col-lg-2">
<input type="text" name="_q" value="{% get_search_key request %}">
</div>
<div class="col-lg-2">
<input type="submit" class="btn btn-success" value="搜索">
</div> <div style='color: red'> 搜索条件包含:
{% for search_field in admin_obj.search_fields %}
{{ search_field }}
+
{% endfor %}
</div>
</div>
{## ————————18PerfectCRM实现King_admin搜索关键字————————#} </form>
</div>
{% endif %}
{## ————————15PerfectCRM实现King_admin多条件过滤————————#} <table class="table table-hover">
<thead>
<tr> {## ————————17PerfectCRM实现King_admin单列排序————————#}
{#循环调用kingadmin/base_admin里的class BaseAdmin下的list_display = () 方法#}
{# {% for column in admin_obj.list_display %}#}
{# <th>{{ column }}</th>#}
{# {% endfor %}#}
{# #}
{% for column in admin_obj.list_display %}
{# <th>{{ column }}</th>#} {#过滤功能1#}
{#排序功能1#}
<th>
{# <a href="?_o={{ column }}">{{ column }}</a>#} {#http://127.0.0.1:8000/kingadmin/crm/customer/?_o=qq#}
{## kingadmin排序功能#}
{# <a href="?_o={% get_orderby_key request column %}">{{ column }}</a>#} {## kingadmin排序功能#} {# 过滤后排序功能 #}
<a href="?_o={% get_orderby_key request column %}{% generate_filter_url admin_obj %}">{{ column }}</a> {#显示排序图标#}
{% display_order_by_icon request column %} </th>
{#排序功能1#}
{% endfor %}
{## ————————17PerfectCRM实现King_admin单列排序————————#} </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 %}
{## ————————18PerfectCRM实现King_admin搜索关键字————————#}
{## ————————17PerfectCRM实现King_admin单列排序————————#}
{# <li><a href="?page={{ admin_obj.querysets.previous_page_number }}{% generate_filter_url admin_obj %}"#}
{# aria-label="Previous"><span aria-hidden="true">&laquo;</span></a></li>#} {#获取上一个数字#} {# kingadmin排序功能 # 过滤后排序功能#排序#} {#分页#}
{#<li><a href="?page={{ admin_obj.querysets.previous_page_number }}{% generate_order_by_url request %}{% generate_filter_url admin_obj %}"#}
{# aria-label="Previous"><span aria-hidden="true">上页</span></a></li>#}
{## ————————17PerfectCRM实现King_admin单列排序————————#}
<li><a href="?page={{ admin_obj.querysets.previous_page_number }}
{% generate_order_by_url request %}{% generate_filter_url admin_obj %}&_q={% get_search_key request %}"
aria-label="Previous"><span aria-hidden="true">上页</span></a></li>
{## ————————18PerfectCRM实现King_admin搜索关键字————————#}
{% else %}
<li class="disabled">
<a href="#" aria-label="Previous"><span aria-hidden="true">&laquo;</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 %}
{## ————————18PerfectCRM实现King_admin搜索关键字————————#}
{## ————————17PerfectCRM实现King_admin单列排序————————#}
{# <li><a href="?page={{ admin_obj.querysets.next_page_number }}{% generate_filter_url admin_obj %}"#}
{# aria-label="Previous"><span aria-hidden="true">&raquo;</span></a></li>#} {#<li><a href="?page={{ admin_obj.querysets.next_page_number }}{% generate_order_by_url request %}{% generate_filter_url admin_obj %}"#}
{# aria-label="Previous"><span aria-hidden="true">下页</span></a></li>#}
{## ————————17PerfectCRM实现King_admin单列排序————————#}
<li><a href="?page={{ admin_obj.querysets.next_page_number }}
{% generate_order_by_url request %}{% generate_filter_url admin_obj %}&_q={% get_search_key request %}"
aria-label="Previous"><span aria-hidden="true">下页</span></a></li>
{## ————————18PerfectCRM实现King_admin搜索关键字————————#} {% else %}
<li class="disabled"><a href="#" aria-label="Previous"><span aria-hidden="true">&raquo;</span></a>
</li>
{% endif %}
</ul>
</nav>
</div>
{## ————————14PerfectCRM实现King_admin分页的省略显示————————#} {% endblock %}
{## ————————08PerfectCRM实现King_admin显示注册表的字段表头————————#}

{#table_data_list.html#}

Django项目:CRM(客户关系管理系统)--26--18PerfectCRM实现King_admin搜索关键字-LMLPHP

Django项目:CRM(客户关系管理系统)--26--18PerfectCRM实现King_admin搜索关键字-LMLPHP

Django项目:CRM(客户关系管理系统)--26--18PerfectCRM实现King_admin搜索关键字-LMLPHP

 #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():#不需要空的,判断是否为空
# ————————18PerfectCRM实现King_admin搜索关键字————————
# ————————17PerfectCRM实现King_admin单列排序————————
# if k=="page":continue##kingadmin分页功能 # if k=="page":continue##kingadmin分页功能 #写法一
# elif k=="_o":continue##kingadmin排序功能 <a href="?_o={{ column }}">{{ column }}</a> # if k in ("page","_o") :continue #kingadmin分页功能 #kingadmin排序功能 #写法二 # if k == "page"or k == "_o": #保留的分页关键字 和 排序关键字 #写法三
# continue #continue是结束单次循环
# ————————17PerfectCRM实现King_admin单列排序————————
if k in ("page", "_o", "_q"): continue # kingadmin分页,排序,搜索#判断标签是否存在 自定义的名称
# ————————18PerfectCRM实现King_admin搜索关键字———————— # ————————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分页页数———————— # ————————18PerfectCRM实现King_admin搜索关键字————————
queryset = get_queryset_search_result(request,queryset,admin_obj)##搜索后
# ————————18PerfectCRM实现King_admin搜索关键字———————— # ————————17PerfectCRM实现King_admin单列排序————————
sorted_queryset = get_orderby(request, queryset) #过滤后的结果
# ————————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多条件过滤————————
paginator = Paginator(sorted_queryset, admin_obj.list_per_page)
# ————————17PerfectCRM实现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显示注册表的字段表头———————— # ————————17PerfectCRM实现King_admin单列排序————————
def get_orderby(request,queryset):
# order_by_key = request.GET.get("_o") #获取URL里有没有("_o") <a href="?_o={{ column }}">{{ column }}</a>
# #页面刚开始没有这个值
# if order_by_key != None: #有("_o")这个值 就进行排序
# query_res = queryset.order_by(order_by_key)
# else: #没有就不排序,直接返回
# query_res = queryset
# return query_res #排序时会错 orderby_key = request.GET.get("_o")
if orderby_key:
return queryset.order_by(orderby_key)
return queryset #在table_data_list添加
# def table_data_list(request,app_name,model_name): #详细列表
# sorted_queryset = get_orderby(request, queryset)
#在filter_querysets添加
#if k == "page"or k == "_o": #保留的分页关键字 和 排序关键字
# ————————17PerfectCRM实现King_admin单列排序———————— # ————————18PerfectCRM实现King_admin搜索关键字————————
from django.db.models import Q
def get_queryset_search_result(request,queryset,admin_obj):
search_key = request.GET.get("_q", "")#取定义名,默认为空
q_obj = Q()#多条件搜索 #from django.db.models import Q
q_obj.connector = "OR" # or/或 条件
for column in admin_obj.search_fields: #搜索目标crm/kingadmin里class CustomerAdmin(BaseAdmin):search_fields = ('name','qq',)
q_obj.children.append(("%s__contains" % column, search_key)) #运态添加多个条件
res = queryset.filter(q_obj) #对数据库进行条件搜索
return res #返回结果
#在table_data_list添加
#def table_data_list(request,app_name,model_name): #详细列表
# queryset = get_queryset_search_result(request,queryset,admin_obj)
# ————————18PerfectCRM实现King_admin搜索关键字————————

#views

Django项目:CRM(客户关系管理系统)--26--18PerfectCRM实现King_admin搜索关键字-LMLPHP

Django项目:CRM(客户关系管理系统)--26--18PerfectCRM实现King_admin搜索关键字-LMLPHP

 #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=''#大字符串
# ————————18PerfectCRM实现King_admin搜索关键字————————
search_key = get_search_key(request) # 搜索
# ————————18PerfectCRM实现King_admin搜索关键字————————
# ————————17PerfectCRM实现King_admin单列排序————————
order_by_url = generate_order_by_url(request) # 排序
# ————————17PerfectCRM实现King_admin单列排序————————
# ————————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" #颜色加深
# ————————18PerfectCRM实现King_admin搜索关键字————————
# ————————17PerfectCRM实现King_admin单列排序————————
# ————————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多条件过滤————————
# rest+='''<li class="%s"><a href="?page=%s%s%s">%s<span class="sr-only">(current)</span></a></li>'''\
# %(ele_class,pages,order_by_url,filters,pages)
# ————————17PerfectCRM实现King_admin单列排序————————
rest+='''<li class="%s"><a href="?page=%s%s%s&_q=%s">%s<span class="sr-only">(current)</span></a></li>'''\
%(ele_class,pages,order_by_url,filters,search_key,pages)
# ————————18PerfectCRM实现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多条件过滤———————— # # ————————16PerfectCRM实现King_admin日期过滤————————
from django.utils.timezone import datetime,timedelta
@register.simple_tag
def get_filter_field (filter_column,admin_obj):
select_ele = """<select name='{filter_column}'><option value="">---------</option>""" #标签 字符串 #拼接成下拉框返回
field_obj = admin_obj.model._meta.get_field(filter_column)#调用内置方法
selected = ''
if field_obj.choices:
for choice_item in field_obj.choices:
if admin_obj.filter_condtions.get(filter_column) == str(choice_item[0]):
selected = "selected"
select_ele += """<option value="%s" %s>%s</option> """ % (choice_item[0], selected, choice_item[1])
selected = "" if type(field_obj).__name__ in "ForeignKey":
for choice_item in field_obj.get_choices()[1:]:
if admin_obj.filter_condtions.get(filter_column)== str(choice_item[0]): # 就是选择的这个条件,整数转字符串
selected = "selected"
select_ele += """<option value="%s" %s>%s</option> """ % (choice_item[0], selected, choice_item[1])
selected='' if type(field_obj).__name__ in ['DateTimeField', 'DateField']: # 如果是时间格式
date_els = [] # 日期条件项
today_ele = datetime.now().date() # 今天日期
date_els.append(['今天', today_ele]) # 今天
date_els.append(['昨天', today_ele - timedelta(days=1)]) # 昨天
date_els.append(['近7天', today_ele - timedelta(days=7)]) # 一周
date_els.append(['近30天', today_ele - timedelta(days=30)]) # 三十
date_els.append(['本月', today_ele.replace(day=1)]) # 本月
date_els.append(['近90天', today_ele - timedelta(days=90)]) # 90天
date_els.append(['近365天', today_ele - timedelta(days=365)]) # 365天
date_els.append(['本年', today_ele.replace(month=1, day=1)]) ##今年 for choice_item in date_els:
if admin_obj.filter_condtions.get("%s__gte" %filter_column)==str(choice_item[1]):
selected = 'selected'
select_ele += """<option value="%s" %s>%s</option> """ % (choice_item[1], selected, choice_item[0])
selected = ''
filter_column_name = "%s__gte" %filter_column
else:
filter_column_name = filter_column select_ele += "</select>"
select_ele=select_ele.format(filter_column=filter_column_name)#格式化时间的判断条件
return mark_safe(select_ele)
# ————————16PerfectCRM实现King_admin日期过滤———————— # ————————17PerfectCRM实现King_admin单列排序————————
# kingadmin排序功能
@register.simple_tag
def get_orderby_key(request,column):
current_order_by_key = request.GET.get("_o")
# ————————18PerfectCRM实现King_admin搜索关键字————————
search_key = request.GET.get("_q")
if search_key != None:
if current_order_by_key != None: #如果不为空 #肯定有某列被排序了
if current_order_by_key == column: # 判断是否相等 #当前这列正在被排序
if column.startswith("-"): #startsWith是String类中的一个方法,用来检测某字符串是否以另一个字符串开始,返回值为boolean类型
return column.strip("-") #strip去掉 文本中句子开头与结尾的符号的
else:
return "-%s&_q=%s" % (column, search_key)
return "%s&_q=%s" % (column, search_key)
else:
# ————————18PerfectCRM实现King_admin搜索关键字————————
if current_order_by_key != None: #如果不为空 #肯定有某列被排序了
if current_order_by_key == column: # 判断是否相等 #当前这列正在被排序
if column.startswith("-"): #startsWith是String类中的一个方法,用来检测某字符串是否以另一个字符串开始,返回值为boolean类型
return column.strip("-") #strip去掉 文本中句子开头与结尾的符号的
else:
return "-%s"%column
# else:
# return column
# else:
# return column
return column #同上4句
# kingadmin排序功能 # kingadmin排序功能 显示排序图标
# @register.simple_tag
# def display_order_by_icon(request, column):
# current_order_by_key = request.GET.get("_o")
# if current_order_by_key != None: #肯定有某列被排序了
# if current_order_by_key.strip("-") == column: ## 当前这列正在被排序
# if current_order_by_key.startswith("-"):
# icon = "fa-arrow-up"
# else:
# icon = "fa-arrow-down"
# ele = """<i class="fa %s" aria-hidden="true"></i>""" % icon
# return mark_safe(ele)
# return ''
# kingadmin排序功能 显示排序图标
@register.simple_tag
def display_order_by_icon(request, column):
current_order_by_key = request.GET.get("_o")
if current_order_by_key != None: #肯定有某列被排序了
if current_order_by_key.strip("-") == column: # 当前这列正在被排序 #strip去掉 文本中句子开头与结尾的符号的
if current_order_by_key.startswith("-"): #startsWith是String类中的一个方法,用来检测某字符串是否以另一个字符串开始,返回值为boolean类型
icon = "▲"
else:
icon = "▼"
ele = """<i style='color: red'>%s</i>""" % icon
return mark_safe(ele)
return '' #防止出现 None
# kingadmin排序功能 显示排序图标 # kingadmin排序功能 # 过滤后排序功能 #}
@register.simple_tag
def get_current_orderby_key(request): #注意生成的URL问题
#获取当前正在排序的字段名 #<input type="hidden" name="_o" value="{% get_current_orderby_key request %}">
current_order_by_key = request.GET.get("_o")
return current_order_by_key or ''
# kingadmin排序功能 # 过滤后排序功能 #} # kingadmin排序功能 # 过滤后排序功能 # 排序分页
@register.simple_tag
def generate_order_by_url (request):
current_order_by_key = request.GET.get("_o")
if current_order_by_key != None: # 肯定有某列被排序了
return "&_o=%s" % current_order_by_key
return ''
# kingadmin排序功能 # 过滤后排序功能 # 排序分页
# ————————17PerfectCRM实现King_admin单列排序———————— # ————————18PerfectCRM实现King_admin搜索关键字————————
@register.simple_tag
def get_search_key(request): # 搜索框里保留搜索值
search_key = request.GET.get("_q")
return search_key or ''
# ————————18PerfectCRM实现King_admin搜索关键字————————

#kingadmin_tags.py

Django项目:CRM(客户关系管理系统)--26--18PerfectCRM实现King_admin搜索关键字-LMLPHP

05-11 21:45