kingadmin下的主页 表数据相关操作
内容:
- 过滤操作
- 搜索操作
- 排序操作
- 分页操作
页面:
1、过滤操作:
views:table_obj_list

1 @login_required 2 def table_obj_list(request,app_name,model_name): 3 admin_class = site.enabled_admins[app_name][model_name] 4 querysets = admin_class.model.objects.all().order_by('-id') # 倒序排序 5 # 1、过滤 6 querysets,filter_condtions = get_filter_result(request,querysets) 7 admin_class.filter_condtions = filter_condtions 8 9 return render(request,"kingadmin/table_obj_list.html",locals())

1 def get_filter_result(request,querysets): 2 """ 3 用于 table_obj_list 过滤数据处理 4 """ 5 filter_condtions = {} 6 for key,val in request.GET.items(): 7 if key in ('_page', '_o', '_q'): continue 8 if val: 9 filter_condtions[key] = val 10 11 return querysets.filter(**filter_condtions), filter_condtions
模板页面:

1 <div class="row"> 2 {#过滤选择#} 3 {% if admin_class.list_filter %} 4 <form style="margin:10px"> 5 6 {% for filter_column in admin_class.list_filter %} 7 <span style="margin-right: 6px; margin-left: 30px;color: #337ab7; font-weight:bold">{{ filter_column }}:</span> 8 {% build_filter_ele filter_column admin_class %} 9 {% endfor %} 10 <input type="hidden" name="_o" value="{% get_current_sorted_column_index sorted_column %}"> 11 <input class="btn btn-info" type="submit" value="过滤" style="margin-left: 18px"> 12 </form> 13 {% endif %} 14 15 </div>
自定义标签:
1. build_filter_ele:自定义select标签,用于过滤操作,显示可以过滤的数据

1 @register.simple_tag 2 def build_filter_ele(filter_column,admin_class): 3 """ 4 用于前端显示过滤选择 5 :param filter_column: 模板表中list_filter对象中的每一条数据,list_filter = ['source','consultant','status','date'] 6 :param admin_class.model = models.CustomerInfo 7 odels.CustomerInfo._meta.get_field('status'):取一个字段的对象 8 """ 9 column_obj = admin_class.model._meta.get_field(filter_column) 10 11 try: 12 filter_ele = "<select name='%s' class='btn btn-default'>" %filter_column 13 # column_obj.get_choices()是个方法,获取该字段对象中的choices所有内容(0,‘你好’) 14 # 如该字段对象是外键关联,没有choices属性,则获取关联的外表的所有数据 15 for choice in column_obj.get_choices(): 16 selected = '' 17 if filter_column in admin_class.filter_condtions: #当前字段被过滤了 18 #admin_class.filter_condtions.get(filter_column):结果是字符串'0','1'等,即str(choice[0]) ,choices:(0,‘你好’),(1,‘嗯嗯’)... 19 if str(choice[0]) == admin_class.filter_condtions.get(filter_column): #当前值被选中了 20 selected = 'selected' 21 option = "<option value='%s' %s>%s</option>"%(choice[0],selected,choice[1]) 22 filter_ele += option 23 24 except AttributeError as e: 25 # filter_ele = "<select name='%s__gte' class='btn btn-success'>" % filter_column 26 # get_internal_type():date时间类型判断:'DateField','DateTimeField' 27 filter_ele = "<select name='%s__gte' class='btn btn-default'>" % filter_column 28 if column_obj.get_internal_type() in ('DateField','DateTimeField'): 29 time_obj = datetime.datetime.now() 30 time_list = [ 31 ['','----------'], 32 [time_obj,'Today'], 33 [time_obj - datetime.timedelta(7),'七天内'], 34 [time_obj.replace(day=1),'本月'], 35 [time_obj - datetime.timedelta(90),'三个月内'], 36 [time_obj.replace(month=1,day=1),'YearToDay(YTD)'], 37 ['','ALL'], 38 ] 39 40 for i in time_list: 41 selected = '' 42 # filter_condtions.get("%s__gte" % filter_column)获得日期格式是:Y-m-d , name_gte:大于或等于 43 #time_to_str = Y-m-d (2018-5-18) 44 #http://127.0.0.1:8000/kingadmin/crm/customerinfo/?source=&consultant=&status=&date__gte=2018-5-12 45 time_to_str = '' if not i[0] else "%s-%s-%s" % (i[0].year, i[0].month, i[0].day) 46 if "%s__gte" % filter_column in admin_class.filter_condtions: # 当前字段被过滤了 47 # print('-------------gte') 48 if time_to_str == admin_class.filter_condtions.get("%s__gte" % filter_column): # 当前值被选中了 49 selected = 'selected ' 50 option = "<option value='%s' %s>%s</option>" %(time_to_str, selected, i[1]) 51 filter_ele += option 52 53 filter_ele += "</select>" 54 return mark_safe(filter_ele)
2. get_current_sorted_column_index:用于排序与过滤结合使用

1 @register.simple_tag 2 def get_current_sorted_column_index(sorted_column): 3 """排序与过滤结合使用""" 4 5 return list(sorted_column.values())[0] if sorted_column else ''
2、搜索操作:
views:table_obj_list

1 # 2、 搜索 2 querysets = get_serached_result(request, querysets, admin_class) 3 admin_class.search_key = request.GET.get('_q', '')

1 def get_serached_result(request,querysets,admin_class): 2 """获取搜索条件内容,处理后返回搜索后的内容""" 3 4 search_key = request.GET.get('_q') 5 if search_key : 6 q = Q() 7 q.connector = 'OR' 8 9 for search_field in admin_class.search_fields: 10 #Q().children.append("字段名","字段内容"):搜索 11 q.children.append(("%s__contains"% search_field,search_key))# 在q添加子元素:search_field__contains=search_key 12 13 14 return querysets.filter(q) #搜索过滤,留下选择的表中数据 15 return querysets
模板页面:

1 {# 搜索框布局#} 2 <form style="margin-bottom: 5px"> 3 {% if admin_class.search_fields %} 4 <input type="search" placeholder="{% for s in admin_class.search_fields %}{{ s }},{% endfor %}" name="_q" value="{{ admin_class.search_key }}"> 5 <input type="submit" value="Search" style="margin-left: 10px"> 6 7 {% for k,v in admin_class.filter_condtions.items %} 8 <input type="hidden" name="{{ k }}" value="{{ v }}"> 9 {% endfor %} 10 {% endif %} 11 </form>
自定义标签:无
3、排序操作:
views:table_obj_list

1 # 3、排序 2 querysets,sorted_column = get_orderby_result(request,querysets,admin_class)

1 def get_orderby_result(request,querysets,admin_class): 2 """排序功能""" 3 4 current_ordered_column = {} 5 #从前端拿到数据 6 orderby_index = request.GET.get('_o') 7 #如果有值,即有排序 8 if orderby_index: 9 orderby_key = admin_class.list_display[abs(int(orderby_index))] 10 11 current_ordered_column[orderby_key] =orderby_index #为了让前端知道当前排序的列 12 13 if orderby_index.startswith('-'): 14 orderby_key = '-' + orderby_key 15 16 return querysets.order_by(orderby_key),current_ordered_column 17 18 else: 19 return querysets,current_ordered_column
模板页面:

1 # 给html页面内table中的<head><tr><th>加上a标签 2 3 <tr> 4 {% if admin_class.list_display %} 5 {% for column in admin_class.list_display %} 6 <th><a href="?_o={% get_sorted_column column sorted_column forloop.counter0 %}{% render_filtered_args admin_class%}"> 7 {{ column }} 8 {% render_sorted_arrow column sorted_column %} 9 </a></th> 10 11 {% endfor %} 12 {% else %} 13 <th>{% get_model_name admin_class %}</th> 14 {% endif %}
自定义tags标签:
def get_sorted_column:生成排序标签的值

1 @register.simple_tag 2 def get_sorted_column(column,sorted_column,forloop): 3 """ 4 排序功能,前端显示排序效果 5 :param column: 当前各列,for循环实现 6 :param sorted_column: 当前排序列 7 :param forloop: 8 :return: 9 """ 10 if column in sorted_column:#这一列被排序了, 11 #你要判断上一次排序是什么顺序,本次取反 12 last_sort_index = sorted_column[column] 13 #如果是‘-’号开始,eg:-1 、-2 14 if last_sort_index.startswith('-'): 15 this_time_sort_index = last_sort_index.strip('-') 16 else: 17 this_time_sort_index = '-%s' % last_sort_index 18 return this_time_sort_index 19 return forloop
render_filtered_args:用于过滤与排序结合使用

1 def render_filtered_args(admin_class,render_html=True): 2 '''在前端点击排序那行,拼接筛选的字段''' 3 if admin_class.filter_condtions: 4 ele = '' 5 for k,v in admin_class.filter_condtions.items(): 6 ele += '&%s=%s' %(k,v) 7 if render_html:#如果是前端渲染页面,则返回这步 8 return mark_safe(ele) 9 else:#不是渲染页面,返回这步 10 return ele 11 else: 12 return ''
render_sorted_arrow:生成标记

1 @register.simple_tag 2 def render_sorted_arrow(column,sorted_column): 3 """排序列显示升序或降序符号""" 4 if column in sorted_column: # 这一列被排序了, 5 last_sort_index = sorted_column[column] 6 if last_sort_index.startswith('-'): 7 arrow_direction = 'bottom' 8 else: 9 arrow_direction = 'top' 10 ele = '''<span class="glyphicon glyphicon-triangle-%s" aria-hidden="true"></span>''' % arrow_direction 11 return mark_safe(ele) 12 return ''
4、分页:
views:table_obj_list

1 # 4、分页 2 paginator = Paginator(querysets,admin_class.list_per_page) 3 page = request.GET.get('_page') 4 5 try: 6 querysets = paginator.page(page) 7 except PageNotAnInteger: 8 # If page is not an integer, deliver first page. 9 querysets = paginator.page(1) 10 except EmptyPage: 11 # If page is out of range (e.g. 9999), deliver last page of results. 12 querysets = paginator.page(paginator.num_pages)#paginator.num_pages:总页数,即返回最后一页
模板页面:

1 <div class="pagination"> 2 3 {# 分页#} 4 {% render_paginator querysets admin_class sorted_column %} 5 6 </div>
自定义标签:render_paginator:分页,结合过滤、排序及搜索等

1 @register.simple_tag 2 def render_paginator(querysets,admin_class,sorted_column): 3 """ 4 分页功能 5 从views中拿到querysets 6 paginator = Paginator(querysets, 2) :一页显示2行 7 querysets = paginator.page(page):当前页码 8 """ 9 # 拿出搜索条件中的信息,添加进分页,实现点击分页时,搜索、筛选、排序及分页结合使用 10 search_ele = '&_q=%s'%admin_class.search_key 11 12 # 拿到筛选条件中的标签信息,添加进分页中,实现筛选时能结合分页一起使用 13 filter_ele = render_filtered_args(admin_class) 14 15 # 拿到排序列的信息,添加进分页,实现筛选、排序、分页一起结合使用 16 sorted_ele = '' 17 if sorted_column: # 当前排序列信息 18 sorted_ele = '&_o=%s' % list(sorted_column.values())[0] 19 ele = ''' 20 <nav aria-label="Page navigation"> 21 <ul class="pagination"> 22 <li> 23 <a href="?_page=1%s%s%s" aria-label="shouye"> 24 <span aria-hidden="true">首页</span> 25 </a> 26 </li> 27 '''%(search_ele,filter_ele,sorted_ele) 28 if querysets.has_previous(): 29 p_ele = ''' 30 <li><a href="?_page=%s%s%s%s" aria-label="Previous">«上一页</a></li> 31 ''' % (querysets.previous_page_number(),search_ele,filter_ele,sorted_ele) 32 ele += p_ele 33 # querysets.paginator=paginator,page_range:页数范围 34 for i in querysets.paginator.page_range: 35 # querysets.number:当前页码 36 37 if abs(querysets.number - i) < 3:# 只显示相邻页码,最多2页 38 active = '' 39 # 当前页 40 if querysets.number ==i : 41 active = 'active' 42 # # 拿到筛选条件中的标签信息,添加进分页中,实现筛选时能结合分页一起使用 43 # filter_ele = render_filtered_args(admin_class) 44 # 45 # # 拿到排序列的信息,添加进分页,实现筛选、排序、分页一起结合使用 46 # sorted_ele = '' 47 # if sorted_column:# 当前排序列信息 48 # sorted_ele = '&_o=%s' % list(sorted_column.values())[0] 49 p_ele = ''' 50 <li class="%s"><a href="?_page=%s%s%s%s">%s</a></li> 51 '''% (active,i,search_ele,filter_ele,sorted_ele,i) 52 ele += p_ele 53 #是否有下一页 54 if querysets.has_next(): 55 p_ele = ''' 56 <li><a href="?_page=%s%s%s%s" aria-label="Next">下一页»</a></li> 57 ''' % (querysets.next_page_number(),search_ele,filter_ele,sorted_ele) 58 ele += p_ele 59 60 #querysets.paginator.num_pages:总页数 61 p_ele = ''' 62 <li> 63 <a href="?_page=%s%s%s%s" aria-label="weiye"> 64 <span aria-hidden="true">尾页</span> 65 </a> 66 </li> 67 '''% (querysets.paginator.num_pages,search_ele,filter_ele,sorted_ele) 68 ele += p_ele 69 70 ele += "</ul></nav>" 71 return mark_safe(ele)
PS:自定义模板标签:

1 1 """ 2 2 templatetags包,用于创建自定义标签,再用于前端显示 3 3 自定义标签步骤: 1、在APP文件中创建 templatetags包(不是文件夹) 4 4 2、在templatetags包中创建 kingadmin.py文件 5 5 3、导入:from django.template import Library 6 6 4、实例化:register = Library() 。注:命名必须‘register’,不能改 7 7 """
源码
urls:

1 from django.urls import path,re_path 2 from kingadmin import views 3 4 urlpatterns = [ 5 path('login/',views.acc_login), 6 path('logout/',views.acc_logout,name='logout'), 7 re_path(r'^$',views.app_index,name='app_index'), 8 re_path(r'^(\w+)/(\w+)/$',views.table_obj_list,name='table_obj_list'), 9
views:

1 from django.shortcuts import render,redirect 2 from django.contrib.auth import authenticate,logout,login 3 from kingadmin import app_setup 4 from kingadmin.sites import site 5 from django.contrib.auth.decorators import login_required 6 from django.core.paginator import Paginator,PageNotAnInteger,EmptyPage 7 from django.db.models import Q 8 from kingadmin import form_handle 9 10 11 12 app_setup.kingadmin_auto_discover() 13 print("site: ",site.enabled_admins) 14 15 # Create your views here. 16 17 def acc_login(request): 18 """登录页""" 19 error_msg = '' 20 if request.method == "POST": 21 username = request.POST.get("username") 22 password = request.POST.get("password") 23 # remtime = request.POST.get("remtime") 24 user = authenticate(username = username ,password = password) 25 if user: 26 login(request,user) 27 # if remtime: 28 # request.session.set_expiry(10) #session失效时间 29 30 #使用Django自带login_required装饰器,在登录页调整时url路径会有类似 next=/crm/ 数据,需获取到next值, 31 #再通过redirect重定向到该页面,如无next值,则返回默认路径(如/crm/) 32 # return redirect(request.GET.get("next","/crm/")) 33 return redirect('/kingadmin/') 34 else: 35 36 error_msg = "Wrong username or password!" 37 return render(request,"kingadmin/login.html",{"error_msg":error_msg}) 38 39 40 def acc_logout(request): 41 logout(request) 42 return redirect("kingadmin/login/") 43 44 45 def app_index(request): 46 """kingadmin下的首页""" 47 return render(request,"kingadmin/app_index.html",{"site":site}) 48 49 50 51 def get_filter_result(request,querysets): 52 """ 53 用于 table_obj_list 过滤数据处理 54 """ 55 filter_condtions = {} 56 for key,val in request.GET.items(): 57 if key in ('_page', '_o', '_q'): continue 58 if val: 59 filter_condtions[key] = val 60 61 return querysets.filter(**filter_condtions), filter_condtions 62 63 def get_orderby_result(request,querysets,admin_class): 64 """排序功能""" 65 66 current_ordered_column = {} 67 #从前端拿到数据 68 orderby_index = request.GET.get('_o') 69 #如果有值,即有排序 70 if orderby_index: 71 orderby_key = admin_class.list_display[abs(int(orderby_index))] 72 73 current_ordered_column[orderby_key] =orderby_index #为了让前端知道当前排序的列 74 75 if orderby_index.startswith('-'): 76 orderby_key = '-' + orderby_key 77 78 return querysets.order_by(orderby_key),current_ordered_column 79 80 else: 81 return querysets,current_ordered_column 82 83 84 def get_serached_result(request,querysets,admin_class): 85 """获取搜索条件内容,处理后返回搜索后的内容""" 86 87 search_key = request.GET.get('_q') 88 if search_key : 89 q = Q() 90 q.connector = 'OR' 91 92 for search_field in admin_class.search_fields: 93 #Q().children.append("字段名","字段内容"):搜索 94 q.children.append(("%s__contains"% search_field,search_key))# 在q添加子元素:search_field__contains=search_key 95 96 97 return querysets.filter(q) #搜索过滤,留下选择的表中数据 98 return querysets 99 100 101 @login_required 102 def table_obj_list(request,app_name,model_name): 103 admin_class = site.enabled_admins[app_name][model_name] 104 105 querysets = admin_class.model.objects.all().order_by('-id') 106 107 # 1、过滤 108 querysets,filter_condtions = get_filter_result(request,querysets) 109 admin_class.filter_condtions = filter_condtions 110 111 # 2、 搜索 112 querysets = get_serached_result(request, querysets, admin_class) 113 admin_class.search_key = request.GET.get('_q', '') 114 115 # 3、排序 116 querysets,sorted_column = get_orderby_result(request,querysets,admin_class) 117 118 119 # 4、分页 120 paginator = Paginator(querysets,admin_class.list_per_page) 121 page = request.GET.get('_page') 122 123 try: 124 querysets = paginator.page(page) 125 except PageNotAnInteger: 126 # If page is not an integer, deliver first page. 127 querysets = paginator.page(1) 128 except EmptyPage: 129 # If page is out of range (e.g. 9999), deliver last page of results. 130 querysets = paginator.page(paginator.num_pages)#paginator.num_pages:总页数,即返回最后一页 131 132 133 134 return render(request,"kingadmin/table_obj_list.html",locals())
模板页面:

1 {% extends "kingadmin/index.html" %} 2 {% load kingadmin_tags %} 3 4 {% block right-content-container %} 5 6 <h1 class="page-header">{{ model_name }}</h1> 7 8 <div> 9 10 {# 搜索框布局#} 11 <form style="margin-bottom: 5px"> 12 {% if admin_class.search_fields %} 13 <input type="search" placeholder="{% for s in admin_class.search_fields %}{{ s }},{% endfor %}" name="_q" value="{{ admin_class.search_key }}"> 14 <input type="submit" value="Search" style="margin-left: 10px"> 15 16 {% for k,v in admin_class.filter_condtions.items %} 17 <input type="hidden" name="{{ k }}" value="{{ v }}"> 18 {% endfor %} 19 {% endif %} 20 </form> 21 22 <div class="row"> 23 {#过滤选择#} 24 {% if admin_class.list_filter %} 25 <form style="margin:10px"> 26 27 {% for filter_column in admin_class.list_filter %} 28 <span style="margin-right: 6px; margin-left: 30px;color: #337ab7; font-weight:bold">{{ filter_column }}:</span> 29 {% build_filter_ele filter_column admin_class %} 30 {% endfor %} 31 <input type="hidden" name="_o" value="{% get_current_sorted_column_index sorted_column %}"> 32 <input class="btn btn-info" type="submit" value="过滤" style="margin-left: 18px"> 33 </form> 34 {% endif %} 35 36 </div> 37 38 {#显示表中各数据#} 39 <table class="table table-striped"> 40 <thead> 41 <tr> 42 {% if admin_class.list_display %} 43 {% for column in admin_class.list_display %} 44 <th><a href="?_o={% get_sorted_column column sorted_column forloop.counter0 %}{% render_filtered_args admin_class%}"> 45 {{ column }} 46 {% render_sorted_arrow column sorted_column %} 47 </a></th> 48 49 {% endfor %} 50 {% else %} 51 <th>{% get_model_name admin_class %}</th> 52 {% endif %} 53 54 </tr> 55 </thead> 56 <tbody> 57 {% for obj in querysets %} 58 <tr> 59 {# <td><input row-select="true" type="checkbox" value="{{ obj.id }}"></td>#} 60 {% build_table_row obj admin_class %} 61 </tr> 62 {% endfor %} 63 </tbody> 64 65 66 </table> 67 68 <div class="pagination"> 69 70 {# 分页#} 71 {% render_paginator querysets admin_class sorted_column %} 72 73 </div> 74 75 76 77 78 </div> 79 80 {% endblock %}
自定义标签tags:

1 from django.template import Library 2 from django.utils.safestring import mark_safe 3 import datetime,time 4 5 register = Library() 6 7 8 @register.simple_tag 9 def get_model_name(admin_class): 10 """获取表名""" 11 return admin_class.model._meta.model_name 12 13 @register.simple_tag 14 def get_obj_field_val(form_obj,field): 15 """ 16 返回model obj具体字段的值 17 form_obj = model_form(instance = obj):正在被操作的字段(关键字:instance) 18 getattr(form_obj.instance,field):getattr((正被操作的)对象,field(名称)),映射某对象中某属性的值 19 """ 20 21 return getattr(form_obj.instance,field) 22 23 24 25 26 27 28 @register.simple_tag 29 def build_table_row(obj,admin_class): 30 """ 31 生成自定义标签,用于前端显示各表中数据 32 """ 33 ele = "" 34 if admin_class.list_display:#如果有list_display,则按list_display要求显示数据,如没有list_display,则返回对象str方法 35 for index, column_name in enumerate(admin_class.list_display): 36 """ 37 admin_class = RoleAdmin 38 admin_class.model = model_class(如:model.Role) 39 models.Role._meta.fields:获取model一个表中所有字段相对应的对象 40 models.Role._meta.get_field('status'):取表中单个字段的对象 41 """ 42 column_obj = admin_class.model._meta.get_field(column_name) 43 # 如果column_obj中字段对象有choices值, 44 if column_obj.choices: 45 # get_status_display:获取该字段对象中choices内的内容值 → (0,'你好'),非数字列表 46 column_data = getattr(obj, "get_%s_display" % column_name)() 47 48 else: 49 #将obj对象中的column_name属性值返回 50 column_data = getattr(obj , column_name) 51 52 td_ele = "<td>%s</td>" % column_data 53 if index ==1: 54 td_ele = "<td><a href='%s/change/'>%s</a></td>" % (obj.id , obj) 55 56 ele += td_ele 57 58 else: 59 td_ele = "<td>%s</td>" % obj 60 ele += td_ele 61 62 return mark_safe(ele) 63 64 65 @register.simple_tag 66 def build_filter_ele(filter_column,admin_class): 67 """ 68 用于前端显示过滤选择 69 :param filter_column: 模板表中list_filter对象中的每一条数据,list_filter = ['source','consultant','status','date'] 70 :param admin_class.model = models.CustomerInfo 71 odels.CustomerInfo._meta.get_field('status'):取一个字段的对象 72 """ 73 column_obj = admin_class.model._meta.get_field(filter_column) 74 75 try: 76 filter_ele = "<select name='%s' class='btn btn-default'>" %filter_column 77 # column_obj.get_choices()是个方法,获取该字段对象中的choices所有内容(0,‘你好’) 78 # 如该字段对象是外键关联,没有choices属性,则获取关联的外表的所有数据 79 for choice in column_obj.get_choices(): 80 selected = '' 81 if filter_column in admin_class.filter_condtions: #当前字段被过滤了 82 #admin_class.filter_condtions.get(filter_column):结果是字符串'0','1'等,即str(choice[0]) ,choices:(0,‘你好’),(1,‘嗯嗯’)... 83 if str(choice[0]) == admin_class.filter_condtions.get(filter_column): #当前值被选中了 84 selected = 'selected' 85 option = "<option value='%s' %s>%s</option>"%(choice[0],selected,choice[1]) 86 filter_ele += option 87 88 except AttributeError as e: 89 # filter_ele = "<select name='%s__gte' class='btn btn-success'>" % filter_column 90 # get_internal_type():date时间类型判断:'DateField','DateTimeField' 91 filter_ele = "<select name='%s__gte' class='btn btn-default'>" % filter_column 92 if column_obj.get_internal_type() in ('DateField','DateTimeField'): 93 time_obj = datetime.datetime.now() 94 time_list = [ 95 ['','----------'], 96 [time_obj,'Today'], 97 [time_obj - datetime.timedelta(7),'七天内'], 98 [time_obj.replace(day=1),'本月'], 99 [time_obj - datetime.timedelta(90),'三个月内'], 100 [time_obj.replace(month=1,day=1),'YearToDay(YTD)'], 101 ['','ALL'], 102 ] 103 104 for i in time_list: 105 selected = '' 106 # filter_condtions.get("%s__gte" % filter_column)获得日期格式是:Y-m-d , name_gte:大于或等于 107 #time_to_str = Y-m-d (2018-5-18) 108 #http://127.0.0.1:8000/kingadmin/crm/customerinfo/?source=&consultant=&status=&date__gte=2018-5-12 109 time_to_str = '' if not i[0] else "%s-%s-%s" % (i[0].year, i[0].month, i[0].day) 110 if "%s__gte" % filter_column in admin_class.filter_condtions: # 当前字段被过滤了 111 # print('-------------gte') 112 if time_to_str == admin_class.filter_condtions.get("%s__gte" % filter_column): # 当前值被选中了 113 selected = 'selected ' 114 option = "<option value='%s' %s>%s</option>" %(time_to_str, selected, i[1]) 115 filter_ele += option 116 117 filter_ele += "</select>" 118 return mark_safe(filter_ele) 119 120 121 122 123 @register.simple_tag 124 def render_filtered_args(admin_class,render_html=True): 125 '''在点击排序那行,拼接筛选的字段''' 126 if admin_class.filter_condtions: 127 ele = '' 128 for k,v in admin_class.filter_condtions.items(): 129 ele += '&%s=%s' %(k,v) 130 if render_html: 131 return mark_safe(ele) 132 else: 133 return ele 134 else: 135 return '' 136 137 @register.simple_tag 138 def get_sorted_column(column,sorted_column,forloop): 139 """ 140 排序功能,前端显示排序效果 141 :param column: 当前各列,for循环实现 142 :param sorted_column: 当前排序列 143 :param forloop: 144 :return: 145 """ 146 if column in sorted_column:#这一列被排序了, 147 #你要判断上一次排序是什么顺序,本次取反 148 last_sort_index = sorted_column[column] 149 #如果是‘-’号开始,eg:-1 、-2 150 if last_sort_index.startswith('-'): 151 this_time_sort_index = last_sort_index.strip('-') 152 else: 153 this_time_sort_index = '-%s' % last_sort_index 154 return this_time_sort_index 155 return forloop 156 157 158 @register.simple_tag 159 def get_current_sorted_column_index(sorted_column): 160 """排序与过滤结合使用""" 161 162 return list(sorted_column.values())[0] if sorted_column else '' 163 164 165 @register.simple_tag 166 def render_sorted_arrow(column,sorted_column): 167 """排序列显示升序或降序符号""" 168 if column in sorted_column: # 这一列被排序了, 169 last_sort_index = sorted_column[column] 170 if last_sort_index.startswith('-'): 171 arrow_direction = 'bottom' 172 else: 173 arrow_direction = 'top' 174 ele = '''<span class="glyphicon glyphicon-triangle-%s" aria-hidden="true"></span>''' % arrow_direction 175 return mark_safe(ele) 176 return '' 177 178 @register.simple_tag 179 def render_filtered_args(admin_class,render_html=True): 180 '''在前端点击排序那行,拼接筛选的字段''' 181 if admin_class.filter_condtions: 182 ele = '' 183 for k,v in admin_class.filter_condtions.items(): 184 ele += '&%s=%s' %(k,v) 185 if render_html:#如果是前端渲染页面,则返回这步 186 return mark_safe(ele) 187 else:#不是渲染页面,返回这步 188 return ele 189 else: 190 return '' 191 192 @register.simple_tag 193 def render_paginator(querysets,admin_class,sorted_column): 194 """ 195 分页功能 196 从views中拿到querysets 197 paginator = Paginator(querysets, 2) :一页显示2行 198 querysets = paginator.page(page):当前页码 199 """ 200 # 拿出搜索条件中的信息,添加进分页,实现点击分页时,搜索、筛选、排序及分页结合使用 201 search_ele = '&_q=%s'%admin_class.search_key 202 203 # 拿到筛选条件中的标签信息,添加进分页中,实现筛选时能结合分页一起使用 204 filter_ele = render_filtered_args(admin_class) 205 206 # 拿到排序列的信息,添加进分页,实现筛选、排序、分页一起结合使用 207 sorted_ele = '' 208 if sorted_column: # 当前排序列信息 209 sorted_ele = '&_o=%s' % list(sorted_column.values())[0] 210 ele = ''' 211 <nav aria-label="Page navigation"> 212 <ul class="pagination"> 213 <li> 214 <a href="?_page=1%s%s%s" aria-label="shouye"> 215 <span aria-hidden="true">首页</span> 216 </a> 217 </li> 218 '''%(search_ele,filter_ele,sorted_ele) 219 if querysets.has_previous(): 220 p_ele = ''' 221 <li><a href="?_page=%s%s%s%s" aria-label="Previous">«上一页</a></li> 222 ''' % (querysets.previous_page_number(),search_ele,filter_ele,sorted_ele) 223 ele += p_ele 224 # querysets.paginator=paginator,page_range:页数范围 225 for i in querysets.paginator.page_range: 226 # querysets.number:当前页码 227 228 if abs(querysets.number - i) < 3:# 只显示相邻页码,最多2页 229 active = '' 230 # 当前页 231 if querysets.number ==i : 232 active = 'active' 233 # # 拿到筛选条件中的标签信息,添加进分页中,实现筛选时能结合分页一起使用 234 # filter_ele = render_filtered_args(admin_class) 235 # 236 # # 拿到排序列的信息,添加进分页,实现筛选、排序、分页一起结合使用 237 # sorted_ele = '' 238 # if sorted_column:# 当前排序列信息 239 # sorted_ele = '&_o=%s' % list(sorted_column.values())[0] 240 p_ele = ''' 241 <li class="%s"><a href="?_page=%s%s%s%s">%s</a></li> 242 '''% (active,i,search_ele,filter_ele,sorted_ele,i) 243 ele += p_ele 244 #是否有下一页 245 if querysets.has_next(): 246 p_ele = ''' 247 <li><a href="?_page=%s%s%s%s" aria-label="Next">下一页»</a></li> 248 ''' % (querysets.next_page_number(),search_ele,filter_ele,sorted_ele) 249 ele += p_ele 250 251 #querysets.paginator.num_pages:总页数 252 p_ele = ''' 253 <li> 254 <a href="?_page=%s%s%s%s" aria-label="weiye"> 255 <span aria-hidden="true">尾页</span> 256 </a> 257 </li> 258 '''% (querysets.paginator.num_pages,search_ele,filter_ele,sorted_ele) 259 ele += p_ele 260 261 ele += "</ul></nav>" 262 return mark_safe(ele)
未来的你,会感谢现在努力的你!