1. 程式人生 > >項目一:CRM(客戶關系管理系統)--5

項目一:CRM(客戶關系管理系統)--5

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 ...