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())
View Code
 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
get_filter_result 

 模板页面:

 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>
View Code

 自定义标签:

  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)
build_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 ''
get_current_sorted_column_index

 

 

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', '')
table_obj_list

 

 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
get_serached_result

 

 模板页面:

 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>
html页面

 自定义标签:无

 

3、排序操作:

 views:table_obj_list

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

 

 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
get_orderby_result

 模板页面:

 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 %}
html

 自定义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
def get_sorted_column
 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_filtered_args

  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 ''
render_sorted_arrow

 

 

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:总页数,即返回最后一页
table_obj_list

 

 模板页面:

1 <div class="pagination">
2 
3         {#            分页#}
4         {% render_paginator querysets admin_class sorted_column %}
5 
6     </div>
html

 自定义标签: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">&laquo;上一页</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">下一页&raquo;</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)
def render_paginator

 

 

 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     
kingadmin/urls

 

 

 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())
View Code

 

 

 模板页面:

 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 %}
html

 

 

 自定义标签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">&laquo;上一页</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">下一页&raquo;</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)
kingadmin_tags.py

 

posted on 2018-07-05 21:26  Eric_nan  阅读(266)  评论(0)    收藏  举报