本章咱們將繼續基於庫存的簡單例子來闡述如何在python django中體現MVC的架構,根據djangobook說明:html
M:數據存取部分,由django數據庫層處理,本章要講述的內容。python
V:選擇顯示哪些數據要顯示以及怎樣顯示的部分,由視圖和模板處理。數據庫
C:根據用戶輸入委派視圖的部分,由 Django 框架根據 URLconf 設置,對給定 URL 調用適當的 Python 函數。django
控制層C: 咱們把URLconf 設置看作Django框架的部分,大量的業務邏輯咱們就能夠放入到咱們新增的BIZ層中,模板與views做爲視圖部分更符合MVC的理解。依據這裏模式咱們來實現一個符合實戰的例子,用django模板實現關於當前庫存的查詢頁面。架構
庫存查詢需求:框架
1. 輸入物料名稱,依據模糊匹配模式顯示全部匹配的物料庫存,用列表的方式顯示在界面上。函數
2. 不輸入查詢條件時,點擊查詢按鈕返回當前全部的物料庫存數據(可慮示例的簡單性這裏咱們不實現查詢分頁功能)。url
咱們在InventoryBiz類裏增長一個函數getInventoryByItemName,經過物料名稱來獲取匹配的庫存的Model列表:spa
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的模型對象的關聯查詢也是筆者使用過程當中感到很是方便的功能之一 :)。如上述代碼咱們在業務邏輯層增長了一個查詢功能函數,接下來咱們就是實現視圖層的功能代碼了。3d
如今咱們根據前面的查詢模板來實現一個中國式的簡單查詢界面模板,查詢條件下有一個顯示一個結果表格,查詢到的結果數據返回顯示在表格裏:
<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>
咱們在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')
最後一步就是咱們在工程的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),
)
本章節咱們經過示例,快速的演示了基於MVC架構構建動態網頁的開發模式,可是這種傳統的基於html模板文件的動態數據裝載方式不少時候已經不能知足實際項目的須要,下一章節咱們將結合本章節闡述另外一種動態網頁的構建模式,基於Extjs的網頁構建。