第五章、分頁功能開發
5.1.修改BaseKingAdmin和完善前段頁面顯示
現在訪問沒有注冊的model會報錯,因為基類中沒有寫list_display和list_filter。

在基類中設置一個空列表就可以了
# kingadmin/admin_base.py class BaseKingAdmin(object): list_display = [] list_filter = []
search_fields = []
現在訪問沒有報錯,但是沒有顯示出數據,需要在 build_tab_row 里面添加個判斷

kingadmin_tags.py
@register.simple_tag def build_table_row(obj,admin_class): '''生成一條記錄的html element''' ele = '' if admin_class.list_display: 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 else: td_ele = "<td>%s</td>"%obj ele += td_ele

在table_obj_list.html添加一個判斷

(2)完善前端頁面顯示
配置了list_display的顯示所有列名,沒配置的應該顯示model name
table_obj_lsit.html
<thead <tr> {% if admin_class.list_display %} {% for column in admin_class.list_display %} <th>{{ column }}</th> {% endfor %} {% else %} <th>{% get_model_name admin_class %}</th> {% endif %} </tr> </thead>
kingadmin_tags.py
@register.simple_tag def get_model_name(admin_class): '''獲取表名''' return admin_class.model._meta.model_name.upper()
前端顯示效果

5.2.分頁功能開發

官網實例


(1)kingadmin/views.py
@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 #分頁 paginator = Paginator(querysets, 2) page = request.GET.get('page') try: querysets = paginator.page(page) except PageNotAnInteger: querysets = paginator.page(1) except EmptyPage: querysets = paginator.page(paginator.num_pages) return render(request, 'kingadmin/table_obj_list.html',{'querysets':querysets,'admin_class':admin_class})
(2)table_obj_lsit.html
<div class="pagination"> <span class="step-links"> {% if querysets.has_previous %} <a href="?page={{ querysets.previous_page_number }}">previous</a> {% endif %} <span class="current"> Page {{ querysets.number }} of {{ querysets.paginator.num_pages }}. </span> {% if querysets.has_next %} <a href="?page={{ querysets.next_page_number }}">next</a> {% endif %} </span> </div>
這個時候訪問頁面,確實實現分頁了,但是點下一頁會報錯

因為在后台把page='2'當成過濾條件了,添加個判斷
kingadmin/views.py

5.3.分頁功能優化

(1)kingadmin_tag.py
@register.simple_tag def render_paginator(querysets): '''分頁''' ele = ''' <ul class="pagination"> ''' #page_range是所有的頁,querysets.number是當前頁 for i in querysets.paginator.page_range: #顯示前后三頁,abs是絕對值 if abs(querysets.number - i) < 3: active = '' if querysets.number == i: #如果是當前頁,class='active' active = 'active' p_ele = '''<li class="%s"><a href="?page=%s">%s</a></li>'''%(active,i,i) ele += p_ele ele += "</ul>" return mark_safe(ele)
(2)table_obj_list.html

效果:

