本章咱们将继续基于库存的简单例子来阐述如何在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的网页构建。