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

登陆密码设置参考

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


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


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

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

 #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

 #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搜索关键字的更多相关文章

  1. Django项目:CRM(客户关系管理系统)--84--74PerfectCRM实现CRM权限和权限组限制访问URL

    #models.py # ————————01PerfectCRM基本配置ADMIN———————— from django.db import models # Create your models ...

  2. Django项目:CRM(客户关系管理系统)--85--75PerfectCRM实现CRM扩展权限

    # sales_urls.py # ————————47PerfectCRM实现CRM客户报名流程———————— from django.conf.urls import url from bpm. ...

  3. Django项目:CRM(客户关系管理系统)--82--72PerfectCRM实现CRM动态菜单和角色

    #models.py # ————————01PerfectCRM基本配置ADMIN———————— from django.db import models # Create your models ...

  4. Django项目:CRM(客户关系管理系统)--58--48PerfectCRM实现CRM客户报名流程学生合同

    # sales_urls.py # ————————47PerfectCRM实现CRM客户报名流程———————— from django.conf.urls import url from bpm. ...

  5. Django项目:CRM(客户关系管理系统)--32--24PerfectCRM实现King_admin自定义操作数据

    #admin.py # ————————01PerfectCRM基本配置ADMIN———————— from django.contrib import admin # Register your m ...

  6. Django项目:CRM(客户关系管理系统)--31--23PerfectCRM实现King_admin数据删除

    登陆密码设置参考 http://www.cnblogs.com/ujq3/p/8553784.html # king_urls.py # ————————02PerfectCRM创建ADMIN页面—— ...

  7. Django项目:CRM(客户关系管理系统)--69--59PerfectCRM实现king_admin行内编辑

    #base_admin.py # ————————24PerfectCRM实现King_admin自定义操作数据———————— from django.shortcuts import render ...

  8. Django项目:CRM(客户关系管理系统)--67--57PerfectCRM实现admin批量生成上课记录

    #admin.py # ————————01PerfectCRM基本配置ADMIN———————— from django.contrib import admin # Register your m ...

  9. Django项目:CRM(客户关系管理系统)--65--55PerfectCRM实现CRM客户报名状态颜色变化

    # kingadmin.py # ————————04PerfectCRM实现King_admin注册功能———————— from crm import models #print("ki ...

  10. Django项目:CRM(客户关系管理系统)--64--54PerfectCRM实现CRM客户报名链接

    # kingadmin.py # ————————04PerfectCRM实现King_admin注册功能———————— from crm import models #print("ki ...

随机推荐

  1. 获取url指定参数值(js/vue)

    function getParam(name) { var reg = new RegExp("(^|&)" + name + "=([^&]*)(&am ...

  2. [转].NET Framework 4.5 五个很棒的特性

    自.NET 4.5发布已经过了差不多1年了.但是随着最近微软大多数的发布,与.NET开发者交流的问题显示,开发者仅知道一到两个特性,其他的特性仅仅停留在MSDN并以简单的文档形式存在着. 比如说,当你 ...

  3. [JZOJ3167] 【GDOI2013模拟3】查税

    题目 描述 题目大意 维护一个有一次函数组成的序列 具体来说,对于位置xxx,现在的值为sx+zx∗(T−tx)s_x+z_x*(T-t_x)sx​+zx​∗(T−tx​) 有两个操作,修改某个位置上 ...

  4. 如何在屏幕上查看命令的输出以及在Linux中写入文件

    在Linux中输出命令可以做很多事情(http://www.nanke0834.com) 您可以将命令的输出分配给变量,将其发送到另一个命令/程序以通过管道进行处理或将其重定向到文件以进行进一步分析. ...

  5. iOS7 断了统计和追踪用户的后路

    评论里大家都认可用identifierForVendor 然后用keychain和iCloud各保存一份. 看来这是接近最终结果的办法了. 官方文档又说了下面的话, 又有点费解. 我们只要把最后一组s ...

  6. 为什么Java中的String是设计成不可变的?(Why String is immutable in java)

    There are many reasons due to the string class has been made immutable in Java. These reasons in vie ...

  7. 使用Parallel.Invoke并行你的代码

    优势和劣势 使用Parallel.Invoke的优势就是使用它执行很多的方法很简单,而不用担心任务或者线程的问题.然而,它并不是适合所有的场景.Parallel.Invoke有很多的劣势 如果你使用它 ...

  8. 使用Native API 创建进程

    使用 Native API 创建进程 最近几个星期一直在研究这个题目.因为关于方面的资料比较多(可以看下面的参考文章),所以开始时以为很快就结束了.谁知道真正动起手来才发现有很多要考虑的地方,不过还好 ...

  9. JVM基础总结

  10. 《DSP using MATLAB》Problem 8.18

    代码: %% ------------------------------------------------------------------------ %% Output Info about ...