項目一:CRM(客戶關系管理系統)--5
阿新 • • 發佈:2017-12-24
obj -- ive nec start date 原生 param gen 為我們提供的套路都是一樣的,我們進行模仿重構也是同樣的套路。在此基礎上,我們還可以進一步的擴展!
簡單基礎的功能添加是比較漫長的道路,前面添加了分頁和過濾功能,接下來添加的仍然會是一些瑣碎而又常用的功能。
1. 添加頁面統計功能
這個功能實在是太簡單了,只需要一行代碼就能夠搞定,當然是在這使用Django
的情況,其他框架雖然沒有使用過,但應該一行代碼也能搞定,可以通過直接數據庫查詢將統計結果返回給模板文件進行渲染。我們在這裏使用的方法很簡單,不要更改其他任何文件的代碼,只需要在table_objs.html
文件中添加如下內容(位置自己定):
1 ... 2 </table> 3 {# 添加下面的一行代碼即可! #} 4 <p>數量統計:<mark style="margin: auto 5px">{{ query_set.paginator.count }}</mark></p> 5 <nav> 6 {#分頁處理#} 7 ...
顯示效果如下:
2. 添加搜索功能
2.1. 原生admin搜索功能分析
回來看看起初我們在admin.py
中添加的功能字段:
1 ... 2 #自定義操作 3 class CustomerAdmin(admin.ModelAdmin): 4 list_display = (‘name‘, ‘id‘,‘qq‘,‘source‘,‘consultant‘,‘content‘,‘status‘,‘date‘) 5 list_filter = (‘source‘,‘consultant‘,‘date‘) 6 #搜索功能,並指定搜索字段 7 search_fields = (‘qq‘,‘name‘) 8 raw_id_fields = (‘consult_course‘,) 9 filter_horizontal = (‘tags‘,) 10 list_editable = (‘status‘,) 11 ...
添加了這麽多的功能,大家應該早就發現了吧!Django
2.2. 添加搜索字段
在我們自己的king_admin
中添加,首先要在基類中添加,然後在獨立的自定義子類中添加,具體如下:
1 from CRM import models 2 #創建基類 3 class BaseAdmin(object): 4 list_display = [] 5 list_filter = [] 6 search_fields = [] 7 list_per_page = 10 8 ... 9 #自定義類,顯示特定字段 10 class CustomerAdmin(BaseAdmin): 11 list_display = [‘qq‘,‘name‘,‘source‘,‘consultant‘,‘consult_course‘,‘date‘,‘status‘] 12 list_filters = [‘source‘,‘consultant‘,‘consult_course‘,‘status‘] 13 #添加如下代碼,搜索字段自選 14 search_fields = [‘qq‘, ‘name‘, ‘consultant__name‘] 15 list_per_page = 2 16 #model = models.Customer 17 ...
這裏的consultant__name
考慮到了跨表的問題,先這樣寫,後面在優化的時候集中處理!
2.3. 編寫搜索功能函數
這裏,我們還要考慮一個問題:前面我們添加了過濾、分頁、統計功能,那麽搜索功能是該基於這些功能呢? 很顯然,是必須的。也就是說,當我們將數據過濾後得到的結果,在通過搜索查詢到所需的具體數據。
在utils.py
文件中,過濾功能函數下面繼續編寫搜索功能函數:
1 from django.db.models import Q 2 ... 3 #-----------------------搜索功能----------------------------------- 4 def table_search(request,admin_class,object_list): 5 """ 6 :param request: 封裝的請求體 7 :param admin_class: 自定義類 8 :param object_list: 過濾後的數據 9 :return: 10 """ 11 #在請求中通過參數查詢結果 12 search_text = request.GET.get("_q","") 13 #創建Q查詢對象,組合搜索 14 q_obj = Q() 15 #設定連接方式 16 q_obj.connector = "OR" 17 #遍歷搜索選項 18 for search_words in admin_class.search_fields: 19 q_obj.children.append(("{0}__contains".format(search_words), search_text)) 20 search_result = object_list.filter(q_obj) 21 return search_result, search_text
2.4. 編寫視圖函數
搜索功能已經寫好,視圖函數這裏只需要引用添加就完美了。先找到過濾後的數據變量,將其作為參數傳入即可:
1 def display_objects(request, app_name, table_name): 2 #獲取自定義的admin_class 3 admin_class = enabled_admins[app_name][table_name] 4 #數據查詢 5 #query_set = admin_class.model.objects.all() 6 #分頁處理 7 #1.分頁對象參數構建:對象列表,每頁顯示數量 8 #query_set_list = admin_class.model.objects.all() 9 #延伸===>添加過濾條件 10 query_set_list, filter_conditions = table_filter(request, admin_class) 11 #延伸===>添加搜索功能 12 query_set_list, search_text = table_search(request, admin_class, query_set_list) 13 #2.分頁對象創建 14 paginator = Paginator(query_set_list, admin_class.list_per_page) 15 #3.獲取前端點擊的頁面數值 16 get_page = request.GET.get(‘page‘) 17 #4.頁面異常處理 18 try: 19 #直接獲取該頁內容 20 query_set = paginator.page(get_page) 21 except PageNotAnInteger: 22 #不是整數值,跳轉到首頁 23 query_set = paginator.page(1) 24 except EmptyPage: 25 #超出範圍,跳轉到最後一頁 26 query_set = paginator.page(paginator.num_pages) 27 return render(request, ‘king_admin/table_objs.html‘, 28 {‘admin_class‘: admin_class, 29 ‘query_set‘: query_set, 30 ‘filter_conditions‘: filter_conditions, 31 ‘search_text‘: search_text})
上述文件中添加的內容並不是很多,添加內容如下:
1 #延伸===>添加搜索功能 2 query_set_list, search_text = table_search(request, admin_class, query_set_list) 3 4 #搜索結果作為參數返回 5 ‘search_text‘: search_text
2.5. 編寫模板文件
這裏就不需使用templatetags
,直接在模板添加樣式代碼和後臺數據參數,為了減少代碼的重復,將搜索功能和過濾放在同一個表單裏面:
1 ... 2 <form class="" method="get"> 3 {#條件過濾#} 4 {% for condition in admin_class.list_filters %} 5 <div class="col-lg-2"> 6 <span>{{ condition }}</span> 7 {% render_filter_element condition admin_class filter_conditions %} 8 </div> 9 {% endfor %} 10 <button type="SUBMIT" class="btn btn-success">檢索</button> 11 {# 添加搜索功能 #} 12 <div class="row"> 13 <div class="col-lg-2" style="margin: auto 30px"> 14 <input type="search" name="_q" class="form-control" style="margin-left:15px" value="{{ search_text }}" 15 placeholder="{% for search_field in admin_class.search_fields %}{{ search_field }},{% endfor %} "> 16 </div> 17 <button type="SUBMIT" class="btn btn-success">search</button> 18 </div> 19 </form> 20 ... 21 {# 添加搜索到分頁 #} 22 {% create_page_element query_set filter_conditions search_text %} 23 ...