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

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

ndb 客戶關系 list data verbose 列表 course model turn

前面我們已經將首頁的雛形搞定,關於修飾部分,後面直接套用模板即可!接下來,我們需要做的是添加二級頁面,也就是說,點擊‘客戶表’進入到獨立的顯示頁面可以進行獨立的操作。

1. 添加二級頁面

1.1. 構造二級頁面的路由

1.1.1. 原生admin二級頁面路由分析

原生admin二級頁面路由分析

先看圖:

技術分享圖片

從圖中,我們可以知道該url的構成條件:域名/後臺名稱/應用名稱/表名/

1.1.2. 仿造二級頁面路由

在獨立應用king_admin中的urls.py中添加,如下內容:

1 from django.conf.urls import url
2 from king_admin import views
3 urlpatterns = [ 4 url(r^$, views.index, name=table_index), 5 url(r^(\w+)/(\w+)/$, views.display_objects, name=display_objects), #添加該數據,參數分別表示應用名和表名,name同樣表示映射關系的引用 6 ]

1.2. 構造二級頁面模板

king_admin模板目錄下創建table_objs.html文件,然後只需要繼承一級頁面即可:

 1 {% extends king_admin/table_index.html %}
 2
{% block container %} 3 <div class="panel panel-info"> 4 <div class="panel-heading"> 5 <h3 class="panel-title">Panel title</h3> 6 </div> 7 <div class="panel-body"> 8 <div class="row"> 9 </div> 10
{#具體的表格內容展示 #} 11 <table class="table table-hover"> 12 <thead> 13 <tr> 14 <th> title_name </th> 15 </tr> 16 </thead> 17 <tbody> 18 <tr> </tr> 19 </tbody> 20 </table> 21 </div> 22 </div> 23 {% endblock %}

1.3. 編寫二級頁面視圖函數

內容如下:

1 def display_objects(request, app_name, table_name):
2     return render(request, king_admin/table_objs.html)

1.4. 在首頁中添加鏈接入口

我們還要在首頁文件中添加入口標簽<a></a>,具體內容如下:

table_index.html文件添加內容如下:

 1 ...
 2  <tbody>
 3        {% for table_name, admin in table_names.items %}
 4          <tr>
 5          {#1.鏈接:url/應用名/表名,2. 顯示中文表名--使用自定義標簽進行處理#}
 6            <td><a href="{% url ‘display_objects‘ app_name table_name %}">{% render_verbose_name admin %}</a></td>
 7            <td>添加</td>
 8            <td>修改</td>
 9          </tr>
10        {% endfor %}
11  </tbody>
12                          
13 ...

這樣,我們就能夠通過首頁進入到二級頁面了,當然現在的二級頁面還什麽都沒有,如圖:

技術分享圖片

2. 添加二級頁面顯示內容

二級頁面中,我們看到有很多的內容,這裏先添加顯示表格的相關內容。

2.1. 原生admin添加顯示內容分析

我們之前在原生的admin中進行註冊時,添加了以下內容:

 1 #自定義操作
 2 class CustomerAdmin(admin.ModelAdmin):
 3     #顯示字段
 4     list_display = (name, id,qq,source,consultant,content,status,date)
 5     #過濾
 6     list_filter = (source,consultant,date)
 7     #搜索
 8     search_fields = (qq,name)
 9     raw_id_fields = (consult_course,)
10     #水平顯示
11     filter_horizontal = (tags,)
12     #可編輯
13     list_editable = (status,)
14 class UserProfileAdmin(admin.ModelAdmin):
15     list_display = (user,name)

2.2. king_admin中添加顯示字段

在我們自己編寫的admin中添加:

1 #自定義類,顯示特定字段
2 class CustomerAdmin(BaseAdmin):
3     #顯示字段
4     list_display = [qq,name,source,consultant,consult_course,date,status]
5     #過濾
6     list_filters = [source,consultant,consult_course,status]
7     #model = models.Customer<br>
8 class CustomerFollowUpAdmin(BaseAdmin):
9     list_display = (customer,consultant,date)

過濾是後邊的內容,當前可以不加。

2.3. 根據字段提取數據

要顯示的字段都有了,接下要根據這些字段到數據庫中獲取數據,並在模板渲染即可!

編寫視圖函數即可:

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     return render(request, king_admin/table_objs.html,
8                                  {admin_class: admin_class,
9                                   query_set: query_set})

2.4. 模板添加數據並渲染

在二級頁面的模板中,添加如下內容:

 1 {% extends king_admin/table_index.html %}
 2 {% load tags %}
 3 {% block container %}
 4     <div class="panel panel-info">
 5           <div class="panel-heading">
 6             <h3 class="panel-title">Panel title</h3>
 7           </div>
 8           <div class="panel-body">
 9                <div class="row">
10                </div>
11               {#具體的表格內容展示 #}
12               <table class="table table-hover">
13                   <thead>
14                        <tr>
15                             {% for title_name in admin_class.list_display %}
16                                  <th>{{ title_name }}</th>
17                             {% endfor %}
18                        </tr>
19                   </thead>
20                   <tbody>
21                       {% for item in query_set %}
22                         <tr>
23                             {#創建列表行數據#}
24                             {% create_row item admin_class %}
25                         </tr>
26                       {% endfor %}
27                   </tbody>
28               </table>
29           </div>
30     </div>
31 {% endblock %}

文件內容分析:

  • 自定義標簽
    使用它原因和首頁是一樣的,這裏不再贅述!

自定義標簽文件的內容:

 1 from  django  import template
 2 from  django.utils.safestring import mark_safe
 3 register = template.Library()
 4 #------------------------顯示表名稱-->中文---------------------------
 5 @register.simple_tag
 6 def render_verbose_name(admin_class):
 7     return admin_class.model._meta.verbose_name
 8 #-------------------------創建表格行數據-----------------------------
 9 @register.simple_tag
10 def create_row(query_set_obj, admin_class):
11     #創建標簽元素--空,None不行
12     element = ‘‘
13  
14     #遍歷要顯示的models字段
15     for row in admin_class.list_display:
16     #獲取顯示字段對應的字段對象
17         field_obj = admin_class.model._meta.get_field(row)
18     #獲取數據
19         #判斷choice
20         if field_obj.choices:
21             #通過反射獲取對象裏面的值,並執行該方法get_字段_display()獲取choices裏面的數值
22             row_data = getattr(query_set_obj, get_{0}_display.format(row))()
23         else:
24             row_data = getattr(query_set_obj, row)
25  
26         #時間格式轉換
27         if type(row_data).__name__ == datetime:
28             row_data = row_data.strftime(%Y-%m-%d %H-%M-%S)
29  
30         #標簽元素的拼接
31         element += "<td>{0}</td>".format(row_data)
32     return mark_safe(element)

頁面顯示效果如下:

技術分享圖片

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