Django项目:CRM(客户关系管理系统)--24--16PerfectCRM实现King_admin日期过滤
登陆密码设置参考
http://www.cnblogs.com/ujq3/p/8553784.html
list_filter = ('date','source','consultant','consult_courses',)
list_filter = ('date','source','consultant','consult_courses',)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 33 register = template.Library() # 模板库 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 50 @register.simple_tag 51 def get_model_name(model_obj): 52 return model_obj._meta.model_name 53 54 55 @register.simple_tag 56 def get_app_name(model_obj): 57 return model_obj._meta.app_label 58 59 60 # ————————07PerfectCRM实现King_admin显示注册的表———————— 61 62 63 # ————————09PerfectCRM实现King_admin显示注册表的内容———————— 64 from django.utils.safestring import mark_safe # 使用mark_safe函数标记后,django将不再对该函数的内容进行转义 65 66 67 @register.simple_tag 68 def build_table_row(admin_obj, obj): # 通过kingadmin_tags在后台处理 再传到前端 69 row_ele = "" # 为了生成一整行返回前端 70 if admin_obj.list_display: # 如果不为空,有在crm/kingadmin.py注册site.register(models.Customer,CustomerAdmin) 71 # 循环所有 要显示 的字符串 进行反射 展示 字段 72 for column in admin_obj.list_display: # 循环base_admin里class BaseAdmin下list_display = () 73 column_obj = obj._meta.get_field( column ) # 遍历获取 传进的参数对象 74 75 if column_obj.choices: # 判断如果字段有choices属性 76 # 获取choices的字符串(外健) 77 get_column_data = getattr( obj, "get_%s_display" % column ) # 反射,传进的参数对象,拼接字段 78 column_data = get_column_data() # 函数,拿到数据 79 else: 80 column_data = getattr( obj, column ) # 反射, 81 # ————————10PerfectCRM实现King_admin日期优化———————— 82 if type( column_data ).__name__ == 'datetime': 83 column_data = column_data.strftime( '%Y-%m-%d %H-%M-%S' ) 84 # ————————10PerfectCRM实现King_admin日期优化———————— 85 86 td_ele = '''<td>%s</td>''' % column_data # 把反射来的值 拼接字符串 生成<td> 87 row_ele += td_ele # 把 <td> 拼接到上面到空字符串 88 else: 89 row_ele += "<td>%s</td>" % obj # 把<td>拼接到上面到空字符串,crm/models.py里 def __str__(self):的返回值 90 return mark_safe( row_ele ) # 使用mark_safe函数标记后,django将不再对该函数的内容进行转义 91 92 93 # ————————09PerfectCRM实现King_admin显示注册表的内容———————— 94 95 96 # ————————13PerfectCRM实现King_admin分页页数———————— 97 # 分页功能kingadmin/templates/kingadmin/table_data_list.html里 <a href="?page={{ page }}{% generate_filter_url admin_obj %}">{{ page }} 98 @register.simple_tag 99 def generate_filter_url(admin_obj): # 拼接URL 100 url = '' 101 for k, v in admin_obj.filter_condtions.items(): 102 url += "&%s=%s" % (k, v) 103 return url 104 105 106 # ————————13PerfectCRM实现King_admin分页页数———————— 107 108 # ————————14PerfectCRM实现King_admin分页的省略显示———————— 109 # 分页的省略显示 110 @register.simple_tag 111 def pag_omit(request, admin_obj): # 传入当前页面值 112 rest = '' # 大字符串 113 114 # ————————15PerfectCRM实现King_admin多条件过滤———————— 115 filters = generate_filter_url( admin_obj ) # 分页 116 # ————————15PerfectCRM实现King_admin多条件过滤———————— 117 118 add_tags = False # 标志位 119 for pages in admin_obj.querysets.paginator.page_range: 120 # 前两页 或 后 两页 或 当前页的前后页 121 if pages < 3 or pages > admin_obj.querysets.paginator.num_pages - 2 or abs( 122 admin_obj.querysets.number - pages ) <= 2: 123 # 样式 124 add_tags = False 125 ele_class = '' # 颜色 126 if pages == admin_obj.querysets.number: # --如果是当前页码,颜色加深 不进链接跳转-- 127 ele_class = "active" # 颜色加深 128 129 # ————————15PerfectCRM实现King_admin多条件过滤———————— 130 # rest+='''<li class="%s"><a href="?page=%s">%s</a></li>'''%(ele_class,pages,pages) #--拼接URL-- 131 rest += '''<li class="%s"><a href="?page=%s%s">%s</a></li>''' % ( 132 ele_class, pages, filters, pages) # --拼接URL-- 133 # ————————15PerfectCRM实现King_admin多条件过滤———————— 134 else: 135 136 if add_tags == False: # 如果不是标志位的页面 137 rest += '<li><a>...</a></li>' 138 add_tags = True # 标志位为真 139 140 return mark_safe( rest ) # 使用mark_safe函数标记后,django将不再对该函数的内容进行转义 141 142 143 # ————————14PerfectCRM实现King_admin分页的省略显示———————— 144 145 146 147 # # ————————15PerfectCRM实现King_admin多条件过滤———————— 148 # #多条件过滤 table_data_list.html 传递参数 149 # @register.simple_tag 150 # def get_filter_field (filter_column,admin_obj): 151 # print("admin obj",admin_obj.model ,filter_column) 152 # field_obj = admin_obj.model._meta.get_field(filter_column)#调用内置方法 153 # select_ele = """<select name="%s"> """ %filter_column #拼接成下拉框返回 154 # for choice in field_obj.get_choices():#循环获取crm/models里class Customer(models.Model):下source_choices = ((0,'转介绍'), 155 # selected_condtion = admin_obj.filter_condtions.get(filter_column) 156 # if selected_condtion != None: #if None, 没有过滤这个条件 157 # print("heoe....",filter_column,selected_condtion,type(selected_condtion))#类型是 整数 158 # if selected_condtion == str(choice[0]): #就是选择的这个条件,整数转字符串 159 # selected = "selected" 160 # else: 161 # selected = "" 162 # else: 163 # selected = "" 164 # 165 # #在前端把几个条件提交到后台,后台拿着条件变成一个字典,然后进行过滤,把数据返回前端,并且把条件作为字典返回后端,因为要在前端显示已经过滤的条件。 166 # option_ele = """<option value="%s" %s>%s</option> """ % (choice[0],selected,choice[1]) 167 # select_ele +=option_ele 168 # select_ele += "</select>" 169 # return mark_safe(select_ele) 170 # # ————————15PerfectCRM实现King_admin多条件过滤———————— 171 172 # # ————————16PerfectCRM实现King_admin日期过滤———————— 173 174 from django.utils.timezone import datetime, timedelta 175 176 @register.simple_tag 177 def get_filter_field(filter_column, admin_obj): 178 select_ele = """<select name='{filter_column}'><option value="">---------</option>""" # 标签 字符串 #拼接成下拉框返回 179 field_obj = admin_obj.model._meta.get_field( filter_column ) # 调用内置方法 180 selected = '' 181 if field_obj.choices: 182 for choice_item in field_obj.choices: 183 if admin_obj.filter_condtions.get( filter_column ) == str( choice_item[0] ): 184 selected = "selected" 185 select_ele += """<option value="%s" %s>%s</option> """ % (choice_item[0], selected, choice_item[1]) 186 selected = "" 187 188 if type( field_obj ).__name__ in ['ForeignKey', 'ManyToManyField','OneToOneField']:#外健属性 189 for choice_item in field_obj.get_choices()[1:]: 190 if admin_obj.filter_condtions.get( filter_column ) == str( choice_item[0] ): # 就是选择的这个条件,整数转字符串 191 selected = "selected" 192 select_ele += """<option value="%s" %s>%s</option> """ % (choice_item[0], selected, choice_item[1]) 193 selected = '' 194 195 if type( field_obj ).__name__ in ['DateTimeField', 'DateField']: # 如果是时间格式 196 date_els = [] # 日期条件项 197 today_ele = datetime.now().date() # 今天日期 198 date_els.append( ['今天', today_ele] ) # 今天 199 date_els.append( ['昨天', today_ele - timedelta( days=1 )] ) # 昨天 200 date_els.append( ['近7天', today_ele - timedelta( days=7 )] ) # 一周 201 date_els.append( ['近30天', today_ele - timedelta( days=30 )] ) # 三十 202 date_els.append( ['本月', today_ele.replace( day=1 )] ) # 本月 203 date_els.append( ['近90天', today_ele - timedelta( days=90 )] ) # 90天 204 date_els.append( ['近365天', today_ele - timedelta( days=365 )] ) # 365天 205 date_els.append( ['本年', today_ele.replace( month=1, day=1 )] ) ##今年 206 207 for choice_item in date_els: 208 if admin_obj.filter_condtions.get( "%s__gte" % filter_column ) == str( choice_item[1] ): 209 selected = 'selected' 210 select_ele += """<option value="%s" %s>%s</option> """ % (choice_item[1], selected, choice_item[0]) 211 selected = '' 212 filter_column_name = "%s__gte" % filter_column 213 else: 214 filter_column_name = filter_column 215 216 select_ele += "</select>" 217 select_ele = select_ele.format( filter_column=filter_column_name ) # 格式化时间的判断条件 218 return mark_safe( select_ele ) 219 # ————————16PerfectCRM实现King_admin日期过滤————————
过滤条件 不同写法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 # # ————————16PerfectCRM实现King_admin日期过滤———————— 2 from django.utils.timezone import datetime, timedelta 3 4 5 #过滤条件 6 @register.simple_tag 7 def get_filter_field (filter_column,admin_obj):#过滤条件 8 print("admin obj",admin_obj.model ,filter_column) 9 field_obj = admin_obj.model._meta.get_field(filter_column) 10 select_ele = """<select class="form-control" name='{filter_column}'>""" #标签 字符串 11 #if type(field_obj).__name__=='ForeignKey': 12 13 if type(field_obj).__name__ in ['DateTimeField','DateField']:#如果是时间格式 14 date_els=[]#日期条件项 15 today_ele=datetime.now().date()#今天日期 16 date_els.append(['today_ele',today_ele])#今天 17 date_els.append(['yesterday_ele',today_ele-timedelta(days=1)])#昨天 18 date_els.append(['last7day_ele',today_ele-timedelta(days=7)])#一周 19 date_els.append(['last30day_ele',today_ele-timedelta(days=30)])#三十 20 date_els.append(['mtdy_ele',today_ele.replace(day=1)])#本月 21 date_els.append(['last90day_ele',today_ele-timedelta(days=90)])#90天 22 date_els.append(['last365day_ele',today_ele-timedelta(days=365)])#365天 23 date_els.append(['ytd_ele',today_ele.replace(month=1,day=1)])##今年 24 25 for item in date_els: 26 selected_condtion = admin_obj.filter_condtions.get(filter_column) 27 if selected_condtion != None: #if None, 没有过滤这个条件 28 print("heoe....",filter_column,selected_condtion,type(selected_condtion)) 29 if selected_condtion == str(item[1]): #就是选择的这个条件 30 selected = "selected" 31 else: 32 selected = "" 33 else: 34 selected = "" 35 option_ele = """<option value="%s" %s>%s</option> """ % (item[1],selected,item[0])#选中的条件 36 select_ele +=option_ele 37 filter_column_name="%s__gte"%filter_column 38 else: 39 for choice in field_obj.get_choices():#如果是choices 40 selected_condtion = admin_obj.filter_condtions.get(filter_column) 41 if selected_condtion != None: #if None, 没有过滤这个条件 42 print("heoe....",filter_column,selected_condtion,type(selected_condtion)) 43 if selected_condtion == str(choice[0]): #就是选择的这个条件 44 selected = "selected" 45 else: 46 selected = "" 47 else: 48 selected = "" 49 option_ele = """<option class="form-control" value="%s" %s>%s</option> """ % (choice[0],selected,choice[1])#选中的条件 50 select_ele +=option_ele 51 filter_column_name=filter_column 52 select_ele += "</select>" 53 select_ele=select_ele.format(filter_column=filter_column_name)#格式化时间的判断条件 54 return mark_safe(select_ele) 55 56 # ————————16PerfectCRM实现King_admin日期过滤————————
如果感觉本章博客对您有帮助,请尽情打赏吧!
![](https://files.cnblogs.com/files/ujq3/wxzf.gif)
您的资助是我最大的动力!
金额随意,欢迎来赏!
![](https://files.cnblogs.com/files/ujq3/zfbzf.gif)
如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的
因为,我的写作热情也离不开您的肯定支持,感谢您的阅读,我是【颜言】!