kingadmin設計開發
4.4.根據list_display配置生成數據列表
(1)kingadmin/views.py
(2)kingadmin/templates/kingadmin/table_obj_list.html
通過自定義的admin_class類,循環出list_display所有的列
{#kingadmin/templates/kingadmin/table_obj_list.html#} {% extends 'kingadmin/index.html' %} {% block right-content-container %} <h2 class="page-header">app</h2> <div> {{ querysets }} <table class="table table-striped"> <thead> <tr> {% for column in admin_class.list_display %} <th>{{ column }}</th> {% endfor %} </tr> </thead> <tbody> </tbody> </table> </div> {% endblock %}
(3)自定義模板標簽
kingadmin下創建python package "templatetags",再新建kingadmin_tags.py
# kingadmin/templatetags/kingadmin_tags.py from django.template import Library from django.utils.safestring import mark_safe register = Library() @register.simple_tag def build_table_row(obj,admin_class): '''生成一條記錄的html element''' ele = '' for column_name in admin_class.list_display: #通過反射獲取列的數據,兩個參數,一個是object,一個是列名 column_data = getattr(obj,column_name) td_ele = "<td>%s</td>"%column_data ele += td_ele return mark_safe(ele)
(4)table_obj_list.html
首先要導入:{% load kingadmin_tags%}
然后使用自定義模板標簽:<tr>{% build_table_row obj admin_class %}</tr>
使用的時候需要傳兩個參數進去
{#kingadmin/templates/kingadmin/table_obj_list.html#} {% extends 'kingadmin/index.html' %} {% load kingadmin_tags %} {% block right-content-container %} <h2 class="page-header">app</h2> <div> {{ querysets }} <table class="table table-striped"> <thead> <tr> {% for column in admin_class.list_display %} <th>{{ column }}</th> {% endfor %} </tr> </thead> <tbody> {% for obj in querysets %} <tr>{% build_table_row obj admin_class %}</tr> {% endfor %} </tbody> </table> </div> {% endblock %}
現在訪問就可以看到對應列的數據了,但是status顯示的是“0”,“1”,我們想要的是“未報名”,“已報名”,還有source,contact_tapy
(5)修改kingadmin_tags.py
因為有的字段有choices,有的字段沒有choices,需要添加一個判斷
models.CustomerInfo._meta.fields 獲取model所有字段的對象
models.CustomerInfo._meta.get_field('status') 取一個字段的對象
get_xxxx_display 顯示choices里面的值
# kingadmin/templatetags/kingadmin_tags.py from django.template import Library from django.utils.safestring import mark_safe register = Library() @register.simple_tag def build_table_row(obj,admin_class): '''生成一條記錄的html element''' ele = '' for column_name in admin_class.list_display: #獲取所有字段對象 column_obj = admin_class.model._meta.get_field(column_name) #字段對象的choices方法,如果有choices,則get_xxx_display if column_obj.choices: column_data = getattr(obj,'get_%s_display'%column_name)() else: column_data = getattr(obj,column_name) td_ele = "<td>%s</td>"%column_data ele += td_ele return mark_safe(ele)
現在訪問頁面
4.5.添加過濾功能
(1)kingadmin/views.py
# kingadmin/templatetags/kingadmin_tags.py import datetime from django.template import Library from django.utils.safestring import mark_safe register = Library() @register.simple_tag def build_filter_ele(filter_column,admin_class): filter_ele = "<select name='%s'>"%filter_column column_obj = admin_class.model._meta.get_field(filter_column) try: for choice in column_obj.get_choices(): option = "<option value='%s'>%s</option>"%choice filter_ele += option except AttributeError as e: #get_internal_type():獲取字段屬性 #因為時間的過濾方式是固定的(今天,過去七天,一個月.....),而不是從后台獲取的 if column_obj.get_internal_type() in ('DateField','DateTimeField'): time_obj = datetime.datetime.now() time_list = [ ['','--------'], [time_obj,'Today'], [time_obj - datetime.timedelta(7),'七天內'], [time_obj.replace(day=1),'本月'], [time_obj - datetime.timedelta(90),'三個月內'], [time_obj.replace(month=1,day=1),'YearToDay(YTD)'], #本年 ['','ALL'], ] for i in time_list: option = "<option value='%s'>%s</option>" %(i[0],i[1]) filter_ele += option filter_ele += "</select>" return mark_safe(filter_ele)
(2)table_obj_list.html
<div> <form> {% for filter_column in admin_class.list_filter %} {% build_filter_ele filter_column admin_class %} {% endfor %} <input type="submit" value="過濾"> </form> </div>
訪問頁面
接下來把數據返回到前端
(3)kingadmin/views.py
def get_filter_result(request,querysets): filter_conditions = {} #獲取過濾的字段 for key,val in request.GET.items(): if val: filter_conditions[key] = val #返回過濾后的數據 return querysets.filter(**filter_conditions),filter_conditions @login_required def table_obj_list(request, app_name, model_name): '''取出指定model里的數據返回給前端''' #拿到admin_class后,通過它找到拿到model admin_class = site.enable_admins[app_name][model_name] querysets = admin_class.model.objects.all() querysets,filter_conditions = get_filter_result(request,querysets) admin_class.filter_conditions = filter_conditions return render(request, 'kingadmin/table_obj_list.html',{'querysets':querysets,'admin_class':admin_class})
(4)kingadmin_tags.py
當選擇過濾條件后,給對應值添加選中狀態 selected=selected
現在通過時間過濾會報格式不正確的錯誤
修改時間過濾的格式
現在不報錯了,但並沒有過濾出數據
因為其它條件過濾的時候值是等於,但是根據時間過濾應該是大於等於才對
修改kingadmin_tags.py