Django项目:CRM(客户关系管理系统)--27--19PerfectCRM实现King_admin数据修改
登陆密码设置参考
http://www.cnblogs.com/ujq3/p/8553784.html
{#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):#} {## ————————19PerfectCRM实现King_admin数据修改————————#}
{% build_table_row admin_obj obj %}{# kingadmin动态生成model编辑 #}
{## ————————19PerfectCRM实现King_admin数据修改————————#} </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">«</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">«</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">»</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">»</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) # ————————19PerfectCRM实现King_admin数据修改————————
#循环所有 要显示 的字符串 进行反射 展示 字段
# for column in admin_obj.list_display: #循环base_admin里class BaseAdmin下list_display = ()
for index, column in enumerate(admin_obj.list_display): # 转为列表取 下标 , 字段名
# ————————19PerfectCRM实现King_admin数据修改———————— 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日期优化———————— # ————————19PerfectCRM实现King_admin数据修改———————— if index == 0: #首列
# 生成一个链接 跳转到编辑页面 #Format参数是一个格式字符串(%s升级版)
td_ele = '''<td><a href="/king_admin/{app_name}/{model_name}/{obj_id}/change/">{column_data}</a> </td>'''\
.format(app_name=admin_obj.model._meta.app_label,
model_name=admin_obj.model._meta.model_name,
obj_id=obj.id,
column_data=column_data)
else:
td_ele = '''<td>%s</td>''' % column_data
# td_ele = '''<td>%s</td>''' % column_data #把反射来的值 拼接字符串 生成<td>
# ————————19PerfectCRM实现King_admin数据修改————————
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
# king_urls.py
# ————————02PerfectCRM创建ADMIN页面————————
from django.conf.urls import url
from king_admin import views urlpatterns = [
url(r'^$', views.app_index),#主页 # ————————08PerfectCRM实现King_admin显示注册表的字段表头————————
url(r'^(\w+)/(\w+)/$', views.table_data_list,name='table_data_list'),#详细内容
# ————————08PerfectCRM实现King_admin显示注册表的字段表头———————— # ————————19PerfectCRM实现King_admin数据修改————————
url(r'^(\w+)/(\w+)/(\d+)/change/$', views.table_change,name='table_change'),#修改信息
# ————————19PerfectCRM实现King_admin数据修改———————— ]
# ————————02PerfectCRM创建ADMIN页面————————
# king_urls.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():#不需要空的,判断是否为空
# ————————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搜索关键字———————— # ————————19PerfectCRM实现King_admin数据修改————————
from king_admin import forms
#修改内容
# def table_change(request,app_name,model_name):
# obj_form = forms.CustomerModelForm() #创建一个空表单
# return render(request,"kingadmin/table_change.html",locals()) def table_change(request,app_name,model_name,obj_id):
admin_obj = base_admin.site.registered_sites[app_name][model_name] #获取表对象
#kingadmin/forms.py里def CreateModelForm(request,admin_obj):
model_form = forms.CreateModelForm(request,admin_obj=admin_obj) ##modelform 生成表单 加验证
# obj_form = model_form() # 表单
obj = admin_obj.model.objects.get(id=obj_id)#根据ID获取数据记录 #面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同。
obj_form = model_form(instance=obj) # 数据传入表单
return render(request,"king_admin/table_change.html",locals())
# kingadmin动态生成model编辑
# ————————19PerfectCRM实现King_admin数据修改————————
#views
# forms.py
# ————————19PerfectCRM实现King_admin数据修改————————
from django import forms
from crm import models # class CustomerModelForm(forms.ModelForm):
# class Meta: #调用内置方法
# model = models.Customer #获取表名
# fields = "__all__" #字段 def CreateModelForm(request,admin_obj):
class Meta: #调用内置方法
model = admin_obj.model #获取表名
fields = "__all__" #字段
#type()就是一个最实用又简单的查看数据类型的方法。type()是一个内建的函数,调用它就能够得到一个反回值,从而知道想要查询的对像类型信息。
dynamic_model_form = type("DynamicModelForm", (forms.ModelForm,), {"Meta": Meta}) #生成modelform的类,
return dynamic_model_form
# ————————19PerfectCRM实现King_admin数据修改————————
# forms.py
{#table_change.html#}
{## ————————19PerfectCRM实现King_admin数据修改————————#}
{% extends "king_master/king_index.html" %} {% load kingadmin_tags %}
{% block right-container-content %} {{ obj_form }} {% endblock %}
{## ————————19PerfectCRM实现King_admin数据修改————————#}
{#table_change.html#}
Django项目:CRM(客户关系管理系统)--27--19PerfectCRM实现King_admin数据修改的更多相关文章
- Django项目:CRM(客户关系管理系统)--50--41PerfectCRM实现全局账号密码修改
# gbacc_urls.py # ————————38PerfectCRM实现全局账号登录注销———————— from django.conf.urls import url from gbacc ...
- Django项目:CRM(客户关系管理系统)--84--74PerfectCRM实现CRM权限和权限组限制访问URL
#models.py # ————————01PerfectCRM基本配置ADMIN———————— from django.db import models # Create your models ...
- 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(客户关系管理系统)--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 ...
- Django项目:CRM(客户关系管理系统)--35--27PerfectCRM实现King_admin编辑复选框
#admin.py # ————————01PerfectCRM基本配置ADMIN———————— from django.contrib import admin # Register your m ...
- Django项目:CRM(客户关系管理系统)--44--36PerfectCRM实现King_admin密码修改
# king_urls.py # ————————02PerfectCRM创建ADMIN页面———————— from django.conf.urls import url from king_ad ...
- Django项目:CRM(客户关系管理系统)--41--33PerfectCRM实现King_admin编辑整张表限制
readonly_table=False#默认表单不锁定 readonly_table=True#默认表单不锁定 # forms.py # ————————19PerfectCRM实现King_adm ...
随机推荐
- vue2.0装jquery
1.在项目目录下 cnpm install --save jquery 2.在webpack.base.conf.js中加入 var webpack = require('webpack') 3.在p ...
- SpringMVC的Hello World
本次使用Maven和Spring IO platform创建SpringMVC的Hello World. 一.Maven的Pom文件内容如下: <project xmlns="http ...
- MATLAB 中自定义函数的使用
MATLAB在文件内部(在函数内部)定义函数,但文件名以开头函数来命名,与Java中每个文件只能有一个公开类,但在文件内部还是可以定义其他非公开类一个道理. 无参函数 do.m function do ...
- (一)phonegap自学---不会java也会写原生app
移动设备如日中天的今天 微软的表现让我们这些.net程序员无不心寒!!幸好每次乱世出英豪,古有java能夸平台,.net跨语言,今有phonegap跨设备 phonegap是什么 狂点这 http:/ ...
- python Mean Squared Error vs. Structural Similarity Measure两种算法的图片比较
# by movie on 2019/12/18 import matplotlib.pyplot as plt import numpy as np from skimage import meas ...
- [转]C# 之泛型详解
什么是泛型 我们在编写程序时,经常遇到两个模块的功能非常相似,只是一个是处理int数据,另一个是处理string数据,或者其他自定义的数据类型,但我们没有办法,只能分别写多个方法处理每个数据类型,因为 ...
- 创建vue项目及引入插件
部署开发环境 安装淘宝镜像 npm install -g cnpm --registry=https://registry.npm.taobao.org 安装webpack cnpm install ...
- 染色(dye)
染色(dye) Description Serene 和 Achen 在玩染色游戏.Serene 和 Achen 站在一个 n 个点 m 条边的无向连通图中,在第 i 次玩染色游戏时,Serene 在 ...
- python mysql数据库中 json的存储
首先数据库里的字段类型需要设置为json: 存储这个json时需要把这个json变为字符串,而且是最外层为单引号,内部字符串为双引号!如图: 所以python脚本中这个字段的字符串应该这样写: 得出 ...
- 菜鸟nginx源码剖析数据结构篇(八) 缓冲区链表ngx_chain_t[转]
菜鸟nginx源码剖析数据结构篇(八) 缓冲区链表 ngx_chain_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.c ...