Python开发入门与实战13-基于模板的界面
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 ...
随机推荐
- wampserver配置问题
WAMPServer一些设置的问题 一.WAMPServer修改www目录路径 默认装好WAMPServer之后,会发现www目录路径是在wamp/www目录下,但是这样不满足个人的需求,我想把www ...
- SCOI2005栅栏
Description 农夫约翰打算建立一个栅栏将他的牧场给围起来,因此他需要一些特定规格的木材.于是农夫约翰到木材店购买木材.可是木材店老板说他这里只剩下少部分大规格的木板了.不过约翰可以购买这些木 ...
- 阿里im即时通讯 h5 demo
适合不想装后台环境的同学,用nodejs搭建服务器. 以下是官网提供的node 请求示例: 找到了一个ali-top-sdk 代替topClient 于是请求示例代码如下: TopClient = r ...
- [WPF]ComboBox.Items为空时,点击不显示下拉列表
ComboBox.Items为空时,点击后会显示空下拉列表: ComboBox点击显示下拉列表,大概原理为: ComboBox存在ToggleButton控件,默认ToggleButton.IsChe ...
- java对国际化的支持
国际化的英文为Internationalization,这个也太长了,所以它又称为I18n(英文单词 internationalization的首末字符i和n,18为中间的字符数). 除了i18n还有 ...
- linux 挂载光盘:mount: you must specify the filesystem type
尝试挂载光盘镜像时出现mount: you must specify the filesystem type 使用-t auto -t iso9660 或不加参数都搞不定,最后在以下链接找到解决办法: ...
- 《精通C#》第十六章-动态类型和动态语言运行时-第一节至第四节
在.Net4.0中引入了一个关键字dynamic,这是一个动态类型关键字.Net中还有一个关键字是var,这是一个隐式类型,可以定义本地变量,此时var所代表的实际的数据类型有编译器在初次分配时决定, ...
- 懒加载实现的分页&&网站footer自适应
最近在做手机端,发现下拉刷新和上拉加载的jq控件很少而且自我感觉不好用,比如iscroll之类-- 然后自己写了个懒加载的,也很简单,最基础的代码[不喜勿喷,但蛮实用的] wap手机端懒加载分页: 用 ...
- YY前端课程-自习
1. 默认的浏览器字体 100% = 1em =1rem =16px =12pt em继承父元素,rem只继承html根元素 2. text-align水平对齐影响一个元素中文本的水平对齐方式,控 ...
- 学习ios【2】Objective-C 数字和字符串
一 数字 1.使用Foundation.h可以直接导入所有的头文件. 在XCode中,想查看某个方法帮助,可以将光标放在方法上,按住option键同时单击即可. 官方文档:https://develo ...