13. 基於模板的界面
本章我們將繼續基於庫存的簡單例子來闡述如何在python django中體現MVC的架構,根據djangobook說明:
M:數據存取部分,由django數據庫層處理,本章要講述的內容。
V:選擇顯示哪些數據要顯示以及怎樣顯示的部分,由視圖和模板處理。
C:根據用戶輸入委派視圖的部分,由 Django 框架根據 URLconf 設置,對給定 URL 調用適當的 Python 函數。
控制層C: 我們把URLconf 設置看做Django框架的部分,大量的業務邏輯我們就可以放入到我們新增的BIZ層中,模板與views作為視圖部分更符合MVC的理解。依據這里模式我們來實現一個符合實戰的例子,用django模板實現關於當前庫存的查詢頁面。
庫存查詢需求:
1. 輸入物料名稱,依據模糊匹配模式顯示所有匹配的物料庫存,用列表的方式顯示在界面上。
2. 不輸入查詢條件時,點擊查詢按鈕返回當前所有的物料庫存數據(可慮示例的簡單性這里我們不實現查詢分頁功能)。
13.1. BIZ層實現
我們在InventoryBiz類里增加一個函數getInventoryByItemName,通過物料名稱來獲取匹配的庫存的Model列表:
def getInventoryByItemName(self,itemName) : inventorys = None if itemName: inventorys = Inventory.objects.filter(Item__ItemName__contains='itemName') else: inventorys = Inventory.objects.all() return inventorys
Inventory.objects.filter(Item__ItemName__contains='itemName'),Django的模型對象的關聯查詢也是筆者使用過程中感到非常方便的功能之一 :)。如上述代碼我們在業務邏輯層增加了一個查詢功能函數,接下來我們就是實現視圖層的功能代碼了。
13.2. 頁面模板
現在我們根據前面的查詢模板來實現一個中國式的簡單查詢界面模板,查詢條件下有一個顯示一個結果表格,查詢到的結果數據返回顯示在表格里:
<html> <head> <title>Current Inventory Search</title> </head> <body> <div> <form action="/inventoryQuery/" method="get"> <label ><strong>Item Name:</strong></label> <input type="text" name="q" value={{query}}> <input type="submit" value="Search"> </form> </div> <div> <table border="1"> <tr> <th style="width:10px">Id</th> <th style="width:20px">ItemName</th> <th style="width:30px">Amount</th> </tr> {% if inventorys %} {% for inventory in inventorys %} <tr> <td >{{inventory.InventoryId}}</td> <td >{{inventory.Item.ItemName}}</td> <td >{{inventory.Amount}}</td> </tr> {% endfor %} {% else %} {% endif %} </table> </div> </body> </html>
13.3. Views 函數
我們在views.py里實現業務邏輯與視圖模板的調用和數據裝載就完成了這樣一個基本的查詢功能。
def inventoryQuery(request): error=False if 'q' in request.GET: q = request.GET['q'] if not q: error = True elif len(q) > 20: error = True else: biz = InventoryBiz() inventorys =biz.getInventoryByItemName(q) return render_to_response('inventoryQuery.html', {'inventorys': inventorys, 'query': q}) return render_to_response('inventoryQuery.html')
13.4. urls.py發布
最后一步就是我們在工程的urls里發布我們實現的庫存查詢功能就完成了這個功能的開發工作,是不是很簡單。
urlpatterns = patterns('', # Examples: # url(r'^$', 'mysite.views.home', name='home'), # url(r'^mysite/', include('mysite.mysite.urls')), # Uncomment the admin/doc line below to enable admin documentation: # url(r'^admin/doc/', include('django.contrib.admindocs.urls')), # Uncomment the next line to enable the admin: # url(r'^admin/', include(admin.site.urls)), url(r'^AddInStockBill/$', views.AddInStockBill), url(r'^AddItem/$', views.AddItem), url(r'^success/$', views.success), url(r'^search/$',views.search), url(r'^inventoryQuery/$'
,views.inventoryQuery),
)
13.5. 運行效果
13.6. 小結
本章節我們通過示例,快速的演示了基於MVC架構構建動態網頁的開發模式,但是這種傳統的基於html模板文件的動態數據裝載方式很多時候已經不能滿足實際項目的需要,下一章節我們將結合本章節闡述另一種動態網頁的構建模式,基於Extjs的網頁構建。