标签:+= target content tor __name__ ado 别名 mes 自己的
1 # kingadmin.py 2 # ————————04PerfectCRM实现King_admin注册功能———————— 3 from crm import models 4 #print("kingadmin crm",models.Customer) 5 6 # ————————05PerfectCRM实现King_admin注册功能获取内存———————— 7 # from king_admin.base_admin import register,BaseAdmin 8 from king_admin.base_admin import site,BaseAdmin 9 # ————————05PerfectCRM实现King_admin注册功能获取内存———————— 10 11 # ————————24PerfectCRM实现King_admin自定义操作数据———————— 12 from django.shortcuts import render 13 # ————————24PerfectCRM实现King_admin自定义操作数据———————— 14 15 # ————————28PerfectCRM实现King_admin编辑限制———————— 16 from django.forms import ValidationError 17 from django.shortcuts import render,redirect 18 # ————————28PerfectCRM实现King_admin编辑限制———————— 19 20 #04客户信息表 21 class CustomerAdmin(BaseAdmin):#定制Djanago admin 22 # ————————54PerfectCRM实现CRM客户报名链接———————— 23 # list_display = (‘id‘, ‘qq‘, ‘source‘, ‘consultant‘, ‘content‘, ‘date‘) # 显示字段表头 24 list_display = (‘id‘, ‘qq‘, ‘source‘, ‘consultant‘, ‘content‘, ‘date‘,‘status‘,‘enroll‘) # 显示字段表头 25 # ————————54PerfectCRM实现CRM客户报名链接———————— 26 # ————————11PerfectCRM实现King_admin分页显示条数———————— 27 list_per_page = 2 #分页条数 # 默认分页条数10 28 # ————————11PerfectCRM实现King_admin分页显示条数———————— 29 # ————————16PerfectCRM实现King_admin日期过滤———————— 30 # ————————15PerfectCRM实现King_admin多条件过滤———————— 31 # 过滤器(可以包含ManyToManyField) (注意加 逗号 , ) 32 # list_filter = (‘source‘,‘consultant‘,‘consult_courses‘,) 33 list_filter = (‘date‘,‘source‘,‘consultant‘,‘consult_courses‘,) 34 # ————————15PerfectCRM实现King_admin多条件过滤———————— 35 # ————————16PerfectCRM实现King_admin日期过滤———————— 36 # ————————18PerfectCRM实现King_admin搜索关键字———————— 37 #搜索(不能包含CharField)(注意加 逗号 , ) 38 search_fields = (‘name‘,‘qq‘,) 39 # ————————18PerfectCRM实现King_admin搜索关键字———————— 40 # ————————26PerfectCRM实现King_admin自定义排序———————— 41 ordering = ‘-qq‘ #自定义排序,默认‘-id‘ 42 # ————————26PerfectCRM实现King_admin自定义排序———————— 43 # ————————27PerfectCRM实现King_admin编辑复选框———————— 44 filter_horizontal = (‘tags‘,) #复选框 45 # ————————27PerfectCRM实现King_admin编辑复选框———————— 46 # ————————33PerfectCRM实现King_admin编辑整张表限制———————— 47 readonly_table=True#默认表单不锁定 48 # ————————33PerfectCRM实现King_admin编辑整张表限制———————— 49 50 # ————————55PerfectCRM实现CRM客户报名状态颜色变化———————— 51 colored_fields = { 52 ‘status‘:{‘已报名‘:"rgba(145, 255, 0, 0.78)", 53 ‘未报名‘:"#ddd"},} 54 # ————————55PerfectCRM实现CRM客户报名状态颜色变化———————— 55 56 # ————————54PerfectCRM实现CRM客户报名链接———————— 57 def enroll(self): 58 ‘‘‘报名‘‘‘ 59 print("customize field enroll",self) 60 link_name = "报名" 61 if self.instance.status == 0: 62 link_name = "报名新课程" 63 return ‘‘‘<a class="btn-link" href="/bpm/customer/%s/enrollment/">点击%s</a> ‘‘‘ % (self.instance.id,link_name) 64 # url(r‘^customer/(\d+)/enrollment/$‘, sales_views.enrollment, name="enrollment"), # 客户招生#报名流程一 下一步 65 enroll.display_name = "报名链接" 66 # ————————54PerfectCRM实现CRM客户报名链接———————— 67 68 69 70 # ————————24PerfectCRM实现King_admin自定义操作数据———————— 71 # from django.shortcuts import render 72 actions = [‘test_actions‘,]#定制功能 #测试返回到一个新页面 73 def test_actions(self,request,arg2):#对应的函数 #request类自己的请求 #arg2类的内容 74 return render(request,"king_admin/table_index.html") 75 test_actions.short_description = "测试显示中文" 76 # ————————24PerfectCRM实现King_admin自定义操作数据———————— 77 78 # ————————28PerfectCRM实现King_admin编辑限制———————— 79 # ————————31PerfectCRM实现King_admin编辑多对多限制———————— 80 # readonly_fields = (‘qq‘, ‘consultant‘,) # 不可修改 81 readonly_fields = (‘qq‘, ‘consultant‘,‘tags‘,) # 不可修改 82 # ————————31PerfectCRM实现King_admin编辑多对多限制———————— 83 84 # ————————29PerfectCRM实现King_admin编辑自定义限制———————— 85 def default_form_validation(self,obj): 86 print(‘validation:制定的‘,obj.cleaned_data) 87 consult_course=obj.cleaned_data.get(‘content‘,‘‘)#自制验证字段 88 if len(consult_course)<10: 89 return ValidationError(#添加错误信息 返回 90 ("该字段%(field)s 咨询内容记录不能少于10个字符"), 91 code=‘invalid‘, 92 params={‘field‘:‘content‘,}, 93 ) 94 # ————————29PerfectCRM实现King_admin编辑自定义限制———————— 95 96 # ————————28PerfectCRM实现King_admin编辑限制———————— 97 98 # ————————30PerfectCRM实现King_admin编辑自定义字段验证———————— 99 def clean_name(self,obj,*args,**kwargs):#名称验证 单个 100 name=obj.cleaned_data[‘name‘] 101 if not name: 102 obj.add_error(‘name‘,‘不能为空!‘) 103 return ValidationError(#添加错误信息 返回 104 ("%(field)s:该字段 不能为空"), 105 code=‘invalid‘, 106 params={‘field‘:‘name‘,}, 107 ) 108 elif len(name)<5: 109 obj.add_error(‘name‘,‘不能小于5个字符!‘) 110 #return ValidationError(‘‘,) 111 return ValidationError(#添加错误信息 返回 112 ("%(field)s:该字段 不能小于5个字符!"), 113 code=‘invalid‘, 114 params={‘field‘:‘name‘,}, 115 ) 116 # ————————30PerfectCRM实现King_admin编辑自定义字段验证———————— 117 118 # ————————34PerfectCRM实现CRM自定义用户———————— 119 #10账号表 120 class UserProfileAdmin(BaseAdmin):#定制Djanago admin 121 list_display = (‘id‘, ‘email‘, ‘name‘) # 显示字段表头 122 123 # ————————36PerfectCRM实现King_admin密码修改———————— 124 readonly_fields = (‘password‘,) # 不可修改,限制 125 filter_horizontal = (‘user_permissions‘,‘groups‘) #复选框 126 modelform_exclude_fields=[‘last_login‘]#排除#不显示 #自增日期 #base_admin.py #forms.py 127 # ————————36PerfectCRM实现King_admin密码修改———————— 128 129 site.register(models.UserProfile, UserProfileAdmin) 130 # ————————34PerfectCRM实现CRM自定义用户———————— 131 132 # ————————05PerfectCRM实现King_admin注册功能获取内存———————— 133 # register(models.Customer,CustomerAdmin) 134 # register(models.CourseRecord) 135 site.register(models.Customer,CustomerAdmin) 136 site.register(models.CourseRecord) 137 # ————————05PerfectCRM实现King_admin注册功能获取内存———————— 138 139 # ————————04PerfectCRM实现King_admin注册功能————————
1 #kingadmin_tags.py 2 3 # ————————06PerfectCRM实现King_admin注册功能获取内存优化处理———————— 4 5 # # 因为前端禁止使用下划线开头(_meta.verbose_name ),所以通过后端处理后返回前端。 6 # from django import template #模板 7 # register = template.Library() #模板库 8 # 9 # @register.simple_tag #Django中利用filter与simple_tag为前端自定义函数的实现方法 10 # def get_app_name(model_obj): 11 # 12 # # ————————06PerfectCRM实现King_admin注册功能获取内存优化处理———————— 13 # # return model_obj._meta.verbose_name_plural 14 # ‘‘‘ 15 # #判断 数据库 里如果有 verbose_name 或者 verbose_name_plural 就 调用 如果都没有 就使用默认的(英文) 16 # class Meta: 17 # verbose_name = "04客户信息表" #在 Django Admin 里 表名显示中文 但是会加s 18 # verbose_name_plural = "04客户信息表" #在 Django Admin 里 表名显示中文 不会加s 19 # ‘‘‘ 20 # model_name = model_obj._meta.verbose_name_plural if model_obj._meta.verbose_name else model_obj._meta.verbose_name_plural 21 # if not model_name: 22 # model_name = model_obj._meta.model_name 23 # 24 # return model_name 25 # ————————06PerfectCRM实现King_admin注册功能获取内存优化处理———————— 26 27 # ————————06PerfectCRM实现King_admin注册功能获取内存优化处理———————— 28 29 # ————————07PerfectCRM实现King_admin显示注册的表———————— 30 #因为前端禁止使用下划线开头(_meta.verbose_name ),所以通过后端处理后返回前端。 31 from django import template #模板 32 register = template.Library() #模板库 33 34 35 36 @register.simple_tag #Django中利用filter与simple_tag为前端自定义函数的实现方法 37 def get_model_verbose_name(model_obj): 38 ‘‘‘ 39 #判断 数据库 里如果有 verbose_name 或者 verbose_name_plural 就 调用 如果都没有 就使用默认的(英文) 40 class Meta: 41 verbose_name = "04客户信息表" #在 Django Admin 里 表名显示中文 但是会加s 42 verbose_name_plural = "04客户信息表" #在 Django Admin 里 表名显示中文 不会加s 43 ‘‘‘ 44 model_name = model_obj._meta.verbose_name_plural if model_obj._meta.verbose_name else model_obj._meta.verbose_name_plural 45 if not model_name: 46 model_name = model_obj._meta.model_name 47 return model_name 48 49 @register.simple_tag 50 def get_model_name(model_obj): 51 return model_obj._meta.model_name 52 @register.simple_tag 53 def get_app_name(model_obj): 54 return model_obj._meta.app_label 55 # ————————07PerfectCRM实现King_admin显示注册的表———————— 56 57 58 # # ————————09PerfectCRM实现King_admin显示注册表的内容———————— 59 # from django.utils.safestring import mark_safe #使用mark_safe函数标记后,django将不再对该函数的内容进行转义 60 # @register.simple_tag 61 # def build_table_row(admin_obj,obj):#通过kingadmin_tags在后台处理 再传到前端 62 # row_ele = "" #为了生成一整行返回前端 63 # if admin_obj.list_display:#如果不为空,有在crm/kingadmin.py注册site.register(models.Customer,CustomerAdmin) 64 # 65 # # ————————19PerfectCRM实现King_admin数据修改———————— 66 # #循环所有 要显示 的字符串 进行反射 展示 字段 67 # # for column in admin_obj.list_display: #循环base_admin里class BaseAdmin下list_display = () 68 # for index, column in enumerate(admin_obj.list_display): # 转为列表取 下标 , 字段名 69 # # ————————19PerfectCRM实现King_admin数据修改———————— 70 # 71 # column_obj = obj._meta.get_field(column)#遍历获取 传进的参数对象 72 # if column_obj.choices:#判断如果字段有choices属性 73 # #获取choices的字符串(外健) 74 # get_column_data = getattr(obj,"get_%s_display" % column) #反射,传进的参数对象,拼接字段 75 # column_data = get_column_data()#函数,拿到数据 76 # else: 77 # column_data = getattr(obj, column)#反射, 78 # # ————————10PerfectCRM实现King_admin日期优化———————— 79 # if type(column_data).__name__ == ‘datetime‘: 80 # column_data = column_data.strftime(‘%Y-%m-%d %H-%M-%S‘) 81 # # ————————10PerfectCRM实现King_admin日期优化———————— 82 # 83 # # ————————19PerfectCRM实现King_admin数据修改———————— 84 # 85 # if index == 0: #首列 86 # # 生成一个链接 跳转到编辑页面 #Format参数是一个格式字符串(%s升级版) 87 # td_ele = ‘‘‘<td><a href="/king_admin/{app_name}/{model_name}/{obj_id}/change/">{column_data}</a> </td>‘‘‘\ 88 # .format(app_name=admin_obj.model._meta.app_label, 89 # model_name=admin_obj.model._meta.model_name, 90 # obj_id=obj.id, 91 # column_data=column_data) 92 # else: 93 # td_ele = ‘‘‘<td>%s</td>‘‘‘ % column_data 94 # # td_ele = ‘‘‘<td>%s</td>‘‘‘ % column_data #把反射来的值 拼接字符串 生成<td> 95 # # ————————19PerfectCRM实现King_admin数据修改———————— 96 # row_ele += td_ele #把 <td> 拼接到上面到空字符串 97 # else: 98 # row_ele +="<td>%s</td>" %obj #把<td>拼接到上面到空字符串,crm/models.py里 def __str__(self):的返回值 99 # return mark_safe(row_ele) #使用mark_safe函数标记后,django将不再对该函数的内容进行转义 100 # # ————————09PerfectCRM实现King_admin显示注册表的内容———————— 101 102 103 # ————————54PerfectCRM实现CRM客户报名链接———————— 104 from django.utils.safestring import mark_safe #使用mark_safe函数标记后,django将不再对该函数的内容进行转义 105 from django.core.exceptions import FieldDoesNotExist 106 @register.simple_tag 107 def build_table_row(admin_obj,obj):#通过kingadmin_tags在后台处理 再传到前端 108 row_ele = "" #为了生成一整行返回前端 109 # ————————54PerfectCRM实现CRM客户报名链接———————— 110 column_not=[]#表示不是表中字段列表 111 # ————————54PerfectCRM实现CRM客户报名链接———————— 112 113 if admin_obj.list_display:#如果不为空,有在crm/kingadmin.py注册site.register(models.Customer,CustomerAdmin) 114 # ————————19PerfectCRM实现King_admin数据修改———————— 115 #循环所有 要显示 的字符串 进行反射 展示 字段 116 # for column in admin_obj.list_display: #循环base_admin里class BaseAdmin下list_display = () 117 for index, column in enumerate(admin_obj.list_display): # 转为列表取 下标 , 字段名 118 # ————————19PerfectCRM实现King_admin数据修改———————— 119 # ————————54PerfectCRM实现CRM客户报名链接———————— 120 try: #获取表中的字段 121 # ————————54PerfectCRM实现CRM客户报名链接———————— 122 column_obj = obj._meta.get_field(column)#遍历获取 传进的参数对象 123 if column_obj.choices:#判断如果字段有choices属性 124 #获取choices的字符串(外健) 125 get_column_data = getattr(obj,"get_%s_display" % column) #反射,传进的参数对象,拼接字段 126 column_data = get_column_data()#函数,拿到数据 127 else: 128 column_data = getattr(obj, column)#反射, 129 # ————————10PerfectCRM实现King_admin日期优化———————— 130 if type(column_data).__name__ == ‘datetime‘: 131 column_data = column_data.strftime(‘%Y-%m-%d %H-%M-%S‘) 132 # ————————10PerfectCRM实现King_admin日期优化———————— 133 134 # ————————19PerfectCRM实现King_admin数据修改———————— 135 if index == 0: #首列 136 # 生成一个链接 跳转到编辑页面 #Format参数是一个格式字符串(%s升级版) 137 td_ele = ‘‘‘<td><a href="/king_admin/{app_name}/{model_name}/{obj_id}/change/">{column_data}</a> </td>‘‘‘138 .format(app_name=admin_obj.model._meta.app_label, 139 model_name=admin_obj.model._meta.model_name, 140 obj_id=obj.id, 141 column_data=column_data) 142 143 # ————————55PerfectCRM实现CRM客户报名状态颜色变化———————— 144 elif column in admin_obj.colored_fields: #特定字段需要显示颜色 #如果admin_obj有配置colored_fields 145 color_dic = admin_obj.colored_fields[column] #获取配置#字段名# ‘status‘:{‘已报名‘:"rgba(145, 255, 0, 0.78)", 146 if column_data in color_dic: #如果#已报名#有在配置里 147 td_ele = "<td style=‘background-color:%s‘>%s</td>" % (color_dic[column_data],column_data) #颜色#已报名 148 else: 149 td_ele = "<td>%s</td>" % column_data 150 # ————————55PerfectCRM实现CRM客户报名状态颜色变化———————— 151 152 else: 153 td_ele = ‘‘‘<td>%s</td>‘‘‘ % column_data 154 # td_ele = ‘‘‘<td>%s</td>‘‘‘ % column_data #把反射来的值 拼接字符串 生成<td> 155 # ————————19PerfectCRM实现King_admin数据修改———————— 156 # ————————54PerfectCRM实现CRM客户报名链接———————— 157 except FieldDoesNotExist as e: # 如果没有获取到 158 if hasattr(admin_obj, column): # 从自定义的函数中取值 159 column_func = getattr(admin_obj, column) 160 admin_obj.instance = obj # 对象加入 161 162 column_not.append(column) # 加入非表中字段列表, 163 admin_obj.column_not = column_not # 对象加入 164 column_data = column_func() 165 print(‘column_data‘, column_data) 166 td_ele = ‘‘‘<td>%s</td>‘‘‘ % column_data 167 # ————————54PerfectCRM实现CRM客户报名链接———————— 168 row_ele += td_ele #把 <td> 拼接到上面到空字符串 169 else: 170 row_ele +="<td>%s</td>" %obj #把<td>拼接到上面到空字符串,crm/models.py里 def __str__(self):的返回值 171 return mark_safe(row_ele) #使用mark_safe函数标记后,django将不再对该函数的内容进行转义 172 # ————————54PerfectCRM实现CRM客户报名链接———————— 173 # ————————54PerfectCRM实现CRM客户报名链接———————— 174 ##表中自定verbose_name列名 175 @register.simple_tag 176 def verbose_name_set(admin_obj,column): 177 try: 178 verbose_name=admin_obj.model._meta.get_field(column).verbose_name.upper()#获取别名 179 print(verbose_name,‘verbose_name_set‘) 180 print(admin_obj.model._meta,‘all‘) 181 except FieldDoesNotExist as e: 182 verbose_name=getattr(admin_obj,column).display_name.upper() 183 return verbose_name 184 # ————————54PerfectCRM实现CRM客户报名链接———————— 185 186 187 188 # ————————13PerfectCRM实现King_admin分页页数———————— 189 #分页功能kingadmin/templates/kingadmin/table_data_list.html里 <a href="?page={{ page }}{% generate_filter_url admin_obj %}">{{ page }} 190 @register.simple_tag 191 def generate_filter_url(admin_obj): #拼接URL 192 url = ‘‘ 193 for k,v in admin_obj.filter_condtions.items(): 194 url += "&%s=%s" %(k,v ) 195 return url 196 # ————————13PerfectCRM实现King_admin分页页数———————— 197 198 # ————————14PerfectCRM实现King_admin分页的省略显示———————— 199 #分页的省略显示 200 @register.simple_tag 201 def pag_omit(request,admin_obj):#传入当前页面值 202 rest=‘‘#大字符串 203 # ————————18PerfectCRM实现King_admin搜索关键字———————— 204 search_key = get_search_key(request) # 搜索 205 # ————————18PerfectCRM实现King_admin搜索关键字———————— 206 # ————————17PerfectCRM实现King_admin单列排序———————— 207 order_by_url = generate_order_by_url(request) # 排序 208 # ————————17PerfectCRM实现King_admin单列排序———————— 209 # ————————15PerfectCRM实现King_admin多条件过滤———————— 210 filters = generate_filter_url(admin_obj) # 分页 211 # ————————15PerfectCRM实现King_admin多条件过滤———————— 212 add_tags=False#标志位 213 for pages in admin_obj.querysets.paginator.page_range: 214 # 前两页 或 后 两页 或 当前页的前后页 215 if pages < 3 or pages>admin_obj.querysets.paginator.num_pages -2 or abs(admin_obj.querysets.number -pages) <=2: 216 #样式 217 add_tags=False 218 ele_class=‘‘ #颜色 219 if pages == admin_obj.querysets.number: #--如果是当前页码,颜色加深 不进链接跳转-- 220 ele_class="active" #颜色加深 221 # ————————18PerfectCRM实现King_admin搜索关键字———————— 222 # ————————17PerfectCRM实现King_admin单列排序———————— 223 # ————————15PerfectCRM实现King_admin多条件过滤———————— 224 # rest+=‘‘‘<li class="%s"><a href="?page=%s">%s</a></li>‘‘‘%(ele_class,pages,pages) #--拼接URL-- 225 # rest+=‘‘‘<li class="%s"><a href="?page=%s%s">%s</a></li>‘‘‘%(ele_class,pages,filters,pages) #--拼接URL-- 226 # ————————15PerfectCRM实现King_admin多条件过滤———————— 227 # rest+=‘‘‘<li class="%s"><a href="?page=%s%s%s">%s<span class="sr-only">(current)</span></a></li>‘‘‘\ 228 # %(ele_class,pages,order_by_url,filters,pages) 229 # ————————17PerfectCRM实现King_admin单列排序———————— 230 rest+=‘‘‘<li class="%s"><a href="?page=%s%s%s&_q=%s">%s<span class="sr-only">(current)</span></a></li>‘‘‘231 %(ele_class,pages,order_by_url,filters,search_key,pages) 232 # ————————18PerfectCRM实现King_admin搜索关键字———————— 233 else:#其他的用省略号表示 234 if add_tags==False:#如果不是标志位的页面 235 rest+=‘<li><a>...</a></li>‘ 236 add_tags=True#标志位为真 237 return mark_safe(rest) #使用mark_safe函数标记后,django将不再对该函数的内容进行转义 238 239 # ————————14PerfectCRM实现King_admin分页的省略显示———————— 240 241 242 243 # # ————————15PerfectCRM实现King_admin多条件过滤———————— 244 # #多条件过滤 table_data_list.html 传递参数 245 # @register.simple_tag 246 # def get_filter_field (filter_column,admin_obj): 247 # print("admin obj",admin_obj.model ,filter_column) 248 # field_obj = admin_obj.model._meta.get_field(filter_column)#调用内置方法 249 # select_ele = """<select name="%s"> """ %filter_column #拼接成下拉框返回 250 # for choice in field_obj.get_choices():#循环获取crm/models里class Customer(models.Model):下source_choices = ((0,‘转介绍‘), 251 # selected_condtion = admin_obj.filter_condtions.get(filter_column) 252 # if selected_condtion != None: #if None, 没有过滤这个条件 253 # print("heoe....",filter_column,selected_condtion,type(selected_condtion))#类型是 整数 254 # if selected_condtion == str(choice[0]): #就是选择的这个条件,整数转字符串 255 # selected = "selected" 256 # else: 257 # selected = "" 258 # else: 259 # selected = "" 260 # 261 # #在前端把几个条件提交到后台,后台拿着条件变成一个字典,然后进行过滤,把数据返回前端,并且把条件作为字典返回后端,因为要在前端显示已经过滤的条件。 262 # option_ele = """<option value="%s" %s>%s</option> """ % (choice[0],selected,choice[1]) 263 # select_ele +=option_ele 264 # select_ele += "</select>" 265 # return mark_safe(select_ele) 266 # # ————————15PerfectCRM实现King_admin多条件过滤———————— 267 268 # # ————————16PerfectCRM实现King_admin日期过滤———————— 269 from django.utils.timezone import datetime,timedelta 270 @register.simple_tag 271 def get_filter_field (filter_column,admin_obj): 272 select_ele = """<select name=‘{filter_column}‘><option value="">---------</option>""" #标签 字符串 #拼接成下拉框返回 273 field_obj = admin_obj.model._meta.get_field(filter_column)#调用内置方法 274 selected = ‘‘ 275 if field_obj.choices: 276 for choice_item in field_obj.choices: 277 if admin_obj.filter_condtions.get(filter_column) == str(choice_item[0]): 278 selected = "selected" 279 select_ele += """<option value="%s" %s>%s</option> """ % (choice_item[0], selected, choice_item[1]) 280 selected = "" 281 282 if type(field_obj).__name__ in "ForeignKey": 283 for choice_item in field_obj.get_choices()[1:]: 284 if admin_obj.filter_condtions.get(filter_column)== str(choice_item[0]): # 就是选择的这个条件,整数转字符串 285 selected = "selected" 286 select_ele += """<option value="%s" %s>%s</option> """ % (choice_item[0], selected, choice_item[1]) 287 selected=‘‘ 288 289 if type(field_obj).__name__ in [‘DateTimeField‘, ‘DateField‘]: # 如果是时间格式 290 date_els = [] # 日期条件项 291 today_ele = datetime.now().date() # 今天日期 292 date_els.append([‘今天‘, today_ele]) # 今天 293 date_els.append([‘昨天‘, today_ele - timedelta(days=1)]) # 昨天 294 date_els.append([‘近7天‘, today_ele - timedelta(days=7)]) # 一周 295 date_els.append([‘近30天‘, today_ele - timedelta(days=30)]) # 三十 296 date_els.append([‘本月‘, today_ele.replace(day=1)]) # 本月 297 date_els.append([‘近90天‘, today_ele - timedelta(days=90)]) # 90天 298 date_els.append([‘近365天‘, today_ele - timedelta(days=365)]) # 365天 299 date_els.append([‘本年‘, today_ele.replace(month=1, day=1)]) ##今年 300 301 for choice_item in date_els: 302 if admin_obj.filter_condtions.get("%s__gte" %filter_column)==str(choice_item[1]): 303 selected = ‘selected‘ 304 select_ele += """<option value="%s" %s>%s</option> """ % (choice_item[1], selected, choice_item[0]) 305 selected = ‘‘ 306 filter_column_name = "%s__gte" %filter_column 307 else: 308 filter_column_name = filter_column 309 310 select_ele += "</select>" 311 select_ele=select_ele.format(filter_column=filter_column_name)#格式化时间的判断条件 312 return mark_safe(select_ele) 313 # ————————16PerfectCRM实现King_admin日期过滤———————— 314 315 # ————————17PerfectCRM实现King_admin单列排序———————— 316 # kingadmin排序功能 317 @register.simple_tag 318 def get_orderby_key(request,column): 319 current_order_by_key = request.GET.get("_o") 320 # ————————18PerfectCRM实现King_admin搜索关键字———————— 321 search_key = request.GET.get("_q") 322 if search_key != None: 323 if current_order_by_key != None: #如果不为空 #肯定有某列被排序了 324 if current_order_by_key == column: # 判断是否相等 #当前这列正在被排序 325 if column.startswith("-"): #startsWith是String类中的一个方法,用来检测某字符串是否以另一个字符串开始,返回值为boolean类型 326 return column.strip("-") #strip去掉 文本中句子开头与结尾的符号的 327 else: 328 return "-%s&_q=%s" % (column, search_key) 329 return "%s&_q=%s" % (column, search_key) 330 else: 331 # ————————18PerfectCRM实现King_admin搜索关键字———————— 332 if current_order_by_key != None: #如果不为空 #肯定有某列被排序了 333 if current_order_by_key == column: # 判断是否相等 #当前这列正在被排序 334 if column.startswith("-"): #startsWith是String类中的一个方法,用来检测某字符串是否以另一个字符串开始,返回值为boolean类型 335 return column.strip("-") #strip去掉 文本中句子开头与结尾的符号的 336 else: 337 return "-%s"%column 338 # else: 339 # return column 340 # else: 341 # return column 342 return column #同上4句 343 # kingadmin排序功能 344 345 # kingadmin排序功能 显示排序图标 346 # @register.simple_tag 347 # def display_order_by_icon(request, column): 348 # current_order_by_key = request.GET.get("_o") 349 # if current_order_by_key != None: #肯定有某列被排序了 350 # if current_order_by_key.strip("-") == column: ## 当前这列正在被排序 351 # if current_order_by_key.startswith("-"): 352 # icon = "fa-arrow-up" 353 # else: 354 # icon = "fa-arrow-down" 355 # ele = """<i class="fa %s" aria-hidden="true"></i>""" % icon 356 # return mark_safe(ele) 357 # return ‘‘ 358 # kingadmin排序功能 显示排序图标 359 @register.simple_tag 360 def display_order_by_icon(request, column): 361 current_order_by_key = request.GET.get("_o") 362 if current_order_by_key != None: #肯定有某列被排序了 363 if current_order_by_key.strip("-") == column: # 当前这列正在被排序 #strip去掉 文本中句子开头与结尾的符号的 364 if current_order_by_key.startswith("-"): #startsWith是String类中的一个方法,用来检测某字符串是否以另一个字符串开始,返回值为boolean类型 365 icon = "▲" 366 else: 367 icon = "▼" 368 ele = """<i style=‘color: red‘>%s</i>""" % icon 369 return mark_safe(ele) 370 return ‘‘ #防止出现 None 371 # kingadmin排序功能 显示排序图标 372 373 # kingadmin排序功能 # 过滤后排序功能 #} 374 @register.simple_tag 375 def get_current_orderby_key(request): #注意生成的URL问题 376 #获取当前正在排序的字段名 #<input type="hidden" name="_o" value="{% get_current_orderby_key request %}"> 377 current_order_by_key = request.GET.get("_o") 378 return current_order_by_key or ‘‘ 379 # kingadmin排序功能 # 过滤后排序功能 #} 380 381 # kingadmin排序功能 # 过滤后排序功能 # 排序分页 382 @register.simple_tag 383 def generate_order_by_url (request): 384 current_order_by_key = request.GET.get("_o") 385 if current_order_by_key != None: # 肯定有某列被排序了 386 return "&_o=%s" % current_order_by_key 387 return ‘‘ 388 # kingadmin排序功能 # 过滤后排序功能 # 排序分页 389 # ————————17PerfectCRM实现King_admin单列排序———————— 390 391 # ————————18PerfectCRM实现King_admin搜索关键字———————— 392 @register.simple_tag 393 def get_search_key(request): # 搜索框里保留搜索值 394 search_key = request.GET.get("_q") 395 return search_key or ‘‘ 396 # ————————18PerfectCRM实现King_admin搜索关键字———————— 397 398 # ————————23PerfectCRM实现King_admin数据删除———————— 399 # <-------------------获取删除映射关系-------------------------------- 400 @register.simple_tag 401 def display_all_related_obj(objs): 402 # 取出对象及所有相关联的数据 403 from django.db.models.query import QuerySet 404 if type(objs) != QuerySet: 405 objs = [objs, ] 406 if objs: 407 model_class = objs[0]._meta.model # 取表对象 408 model_name = objs[0]._meta.model_name # 取表名 409 return mark_safe(recursive_related_objs_lookup(objs)) 410 # <-----------------递归获取映射关系-------------------------------- 411 def recursive_related_objs_lookup(objs, name=None, conn_batch_size=0): 412 name = set() 413 print(name) 414 print(‘传递过来的objs:‘, objs) 415 # 开始标签的拼接 416 ul_ele = "<ul style=‘color: blue‘>" 417 for obj in objs: 418 li_ele = ‘‘‘<li>{0}:{1}</li>‘‘‘.format(obj._meta.verbose_name, obj.__str__().strip("<>")) 419 print(‘str:‘, obj.__str__(), ‘类型:‘, type(obj.__str__())) 420 print(‘关联的表的自定表名:‘, li_ele) 421 ul_ele += li_ele 422 print(‘拼接li_ele:‘, ul_ele) 423 # 映射关系处理 424 # <---------------------------特殊关联处理----------------------------------- 425 # 多对多关系 426 for m2m_field in obj._meta.local_many_to_many: # local_many_to_many返回列表,many_to_many返回元祖 427 print(‘--开始循环反射-多对多-关系处理--‘) 428 sub_ul_ele = "<ul style=‘color: red‘>" 429 m2m_field_obj = getattr(obj, m2m_field.name) # 反射 如果有选项 430 print(‘反射选项:‘, m2m_field_obj) 431 432 for m2m_data in m2m_field_obj.select_related(): 433 print(‘开始循环多对多标签拼接:‘, m2m_data) 434 435 sub_li_ele = ‘‘‘<li>{0}:{1}</li>‘‘‘.format(m2m_field.verbose_name, m2m_data.__str__().strip("<>")) 436 sub_ul_ele += sub_li_ele 437 sub_ul_ele += ‘</ul>‘ 438 ul_ele += sub_ul_ele 439 print(‘生成完整 多对多 标签..:‘, ul_ele) 440 # <---------------------------外健关联处理------------------------------------ 441 for related_obj in obj._meta.related_objects: 442 print(‘--开始-外健关联-处理--‘) 443 if hasattr(obj, related_obj.get_accessor_name()): 444 print(‘--判断对象中是否包含反查属性--‘) 445 accessor_obj = getattr(obj, related_obj.get_accessor_name()) 446 print(‘获取反查对应的对象: ‘) 447 if hasattr(accessor_obj, ‘select_related‘): 448 print(‘--判断有没有获取数据的方法或属性-- ‘) 449 target_object = accessor_obj.select_related() 450 print(‘获取数据的方法或属性: ‘, target_object) 451 452 if ‘ManyToManyRel‘ in related_obj.__repr__(): 453 print(‘--开始-外健关联-多对多-处理--.‘) 454 455 # 生成UL 456 sub_ul_ele = ‘<ul style="color: green">‘ 457 for data in target_object: 458 print(‘开始循环-外健关联-标签拼接...‘, data) 459 sub_li_ele = ‘‘‘<li>{0}:{1}</li>‘‘‘.format(data._meta.verbose_name, 460 data.__str__().strip("<>")) 461 sub_ul_ele += sub_li_ele 462 sub_ul_ele += ‘</ul>‘ 463 ul_ele += sub_ul_ele 464 print(‘-外健关联-生成完整标签:‘, ul_ele) 465 # <---------------递归处理------------------- 466 if len(target_object) != conn_batch_size: 467 print(‘--有下级对象存在,进行-递归-循环--‘) 468 names = target_object.__str__() 469 print(names, type(names)) 470 if names == name: 471 print(‘--如果是自己关联自己,就不递归了--‘) 472 ul_ele += ‘</ul>‘ 473 return ul_ele 474 else: 475 print(‘--防止无限递归+1--‘) 476 conn_batch_size = conn_batch_size + 1 477 node = recursive_related_objs_lookup(target_object, name=names, 478 conn_batch_size=conn_batch_size) 479 ul_ele += node 480 481 # <---------------由于使用递归,下面的标签样会发生重复,就不需要使用了-------------------- 482 else: 483 print(‘外健关联 一对一:‘, accessor_obj) 484 target_object = accessor_obj 485 print("外健关联 一对一:", target_object, ‘属性:‘, type(target_object)) 486 487 ul_ele += ‘</ul>‘ 488 return ul_ele 489 490 # ————————23PerfectCRM实现King_admin数据删除———————— 491 492 493 # ————————24PerfectCRM实现King_admin自定义操作数据———————— 494 #自定制 actions功能 显示 495 @register.simple_tag 496 def get_admin_actions(admin_obj): 497 #选择功能 498 options = "<option class=‘form-control‘ value=‘-1‘>-------</option>"#默认为空 499 actions = admin_obj.default_actions + admin_obj.actions #默认加自定制 500 print(‘默认加自定制‘,actions) 501 for action in actions: 502 action_func = getattr(admin_obj,action)#功能方法 #反射 503 if hasattr(action_func,"short_description"):#反射 如有自定义的名称执行函数方法 504 action_name = action_func.short_description#等于自定义的名称 #显示中文 505 else: 506 action_name = action#等于函数名称 507 options += """<option value="{action_func_name}">{action_name}</option> """.format(action_func_name=action, action_name=action_name) 508 return mark_safe(options) 509 # ————————24PerfectCRM实现King_admin自定义操作数据———————— 510 511 512 513 # ————————27PerfectCRM实现King_admin编辑复选框———————— 514 # 复选 框内容待选数据 515 @register.simple_tag 516 def get_m2m_available_objs(admin_obj, field_name): 517 ‘‘‘返回m2m左侧所有待选数据‘‘‘ 518 # c= admin_obj.model.tags.rel.model.objects.all() 519 # print(‘c‘,c) 520 # m2m_objs= admin_obj.model.tags.rel.model.objects.all() 521 # print(‘m2m_objs‘,m2m_objs) 522 m2m_model = getattr(admin_obj.model, field_name).rel # 复选框对象 523 m2m_objs = m2m_model.model.objects.all() # 获取到复选框所有内容 524 return m2m_objs 525 526 527 # 复选 框内容已选中数据 528 @register.simple_tag 529 def get_m2m_chosen_objs(admin_obj, field_name, obj): 530 """ 531 返回已选中的列表 532 :param admin_obj: 533 :param field_name: 534 :param obj: 数据对象 535 :return: 536 """ 537 # print(["--->obj",obj]) 538 if obj.id: 539 return getattr(obj, field_name).all() # 返回所有的内容 540 return [] # 没有数据为返回空 创建新的记录使用 541 # ————————27PerfectCRM实现King_admin编辑复选框————————
Django项目:CRM(客户关系管理系统)--65--55PerfectCRM实现CRM客户报名状态颜色变化
标签:+= target content tor __name__ ado 别名 mes 自己的
原文地址:https://www.cnblogs.com/ujq3/p/8973020.html