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的网页构建。
Python开发入门与实战13-基于模板的界面的更多相关文章
-
Python开发入门与实战14-基于Extjs的界面
14. 基于Extjs的界面 上一章我们实现了一个原生的html例子,本章我们将采用Extjs实现界面的展现,来说明MVC模式下我们是怎么考虑界面与业务层的关系的. 14.1. 引用Extjs目录 首 ...
-
Python开发入门与实战15-IIS部署
15. IIS部署 前面的章节我们完成了基本的业务功能的开发,本章节我们来说说python django项目如何部署到实际的运行环境,完成开发系统的发布工作. Python Django 项目部署发布 ...
-
Python开发入门与实战4-模板页面
4.Django基于模板页面 在前一章中,HTML是直接被硬编码在 Python views.py代码中,如下: from django.http import HttpResponse import ...
-
Python开发入门与实战1-开发环境
1.搭建Python Django开发环境 1.1.Python运行环境安装 Python官网:http://www.python.org/ Python最新源码,二进制文档,新闻资讯等可以在Pyth ...
-
Python开发入门与实战8-基于Java的集成开发环境
8. 基于Java的Python的集成开发环境 目前为止我们所有的代码和例子都是通过Notepad文本编辑器来实现的,实际项目开发中这种编码模式效率较低(大虾除外),使用IDE集成开发环境常常大幅度的 ...
-
Python开发入门与实战9-基于vs的集成开发环境
9. 基于visual studio的Python的集成开发环境 上一章我们描述了如何安装使用Java的集成开发环境Eclipse IDE,本章我们来说明另一种集成开发环境,也是笔者多年的开发习惯使用 ...
-
python工业互联网应用实战13—基于selenium的功能测试
本章节我们再来说说测试,单元测试和功能测试.单元测试我们在数据验证章节简单提过了,本章我们进一步如何用单元测试来测试view的功能代码:同时,也涉及一下基于selenium的功能测试做法.笔者过去的项 ...
-
Python开发入门与实战10-事务
1. 事务 本章我们将通过一个例子来简要的说明“事务”,这个开发实战里经常遇到的名词.事务是如何体现在一个具体的业务和系统的实现里. 事务是通过将一组相关操作组合为一个,要么全部成功要么全部失败的单元 ...
-
Python开发入门与实战7-Django Form
7. Django Form 7.1. Form表单 Django带有一个form库,称为django.forms,这个库可以处理上一章提到的包括HTML表单的自动生成以及数据验证. 我们在inven ...
随机推荐
-
简单谈谈eclipse下搭建PhoneGap环境来开发Android程序 - linux86(转)
原来在逛园子的时候一不小心发现了一个新概念“PhoneGap”简称PG,我一直都喜欢追逐新事物,自然就产生了好奇心.于是乎我就在百度上面Google了一下PhoneGap是什么东西.简单的说就是用另一 ...
-
[qemu] 挂载qcow2文件,qcow2里边还有个lvm
环境:archlinux 背景:在虚拟机里玩dpdk,把挂载HugePage(hugetlbfs)的命令写入fstab的时候,写错了,无法启动,需要把qcow2挂起来改一下. 方法:使用qemu-nb ...
-
[Effective C++ --015]在资源管理类中提供对原始资源的访问
引言 资源管理类是防止资源泄漏的有力武器,但是许多APIs直接指涉资源,除非你发誓永不使用这样的APIs,否则只得绕过资源管理对象(resource-managing objects)直接访问原始资源 ...
-
zoj 3819 Average Score
Average Score Time Limit: 2 Seconds Memory Limit: 65536 KB Bob is a freshman in Marjar Universi ...
-
J2EE的13个规范之JDBC
假设让你接触一样新的东西.你可能感觉无所适从,可是假设本来就是旧事物的话,你学习起来还难吗? 一.ODBC,我们的老朋友 ODBC(Open Database Connectivity)是微软公司与数 ...
-
webapi中的路由约束
Route Constraints Route constraints let you restrict how the parameters in the route template are ma ...
-
iOS 数据储存--SQLite 操作数据库-FMDB,sqlite数据类型,保存图片,demo
1.SQLite 语句中 数据类型的储存 /* 不区分大小写 char(长度).字符串 NULL. 空值 INTEGER. 整型 REAL.浮点型 TEXT.文本类型 BLOB. 二进制类型,用来存储 ...
-
指令创建 Express Node.js 项目
1.安装 Express 1.1 安装 Express 框架 首先保证已经安装过了 Node.js,然后进入终端使用管理员身份来安装 Express 框架. # 安装 express $ sudo n ...
-
装机人员工具 - imsoft.cnblogs
链接:http://pan.baidu.com/s/1i3kgpAP 密码:4uzr
-
Solr合并索引方式
索引合并并不会判断uniqueKey,所以主键有重复不会判断主键会重复. 官方的解释是不要有重复. 要合并索引,它们必须满足以下要求: 这两个索引必须兼容:它们的架构应该包含相同的字段,并且它们应该以 ...