項目一:CRM(客戶關系管理系統)--3
阿新 • • 發佈:2017-12-24
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 views3 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