7. Django Form

7.1. Form表单

  Django带有一个form库,称为django.forms,这个库可以处理上一章提到的包括HTML表单的自动生成以及数据验证。

我们在inventory目录下增加forms.py文件,与models.py文件类似,专门用来存储form类。

class ItemForm(forms.Form):

  ItemCode = forms.CharField()

  ItemName = forms.CharField()

  Remark = froms.CharField(required=False)

  Form类创建后生成相应字段的html描述格式,Form对象还可以进行校验数据。我们创建一个新的Form象,初始化为匹配的字典类型数据。这样我们form的is_valid()方法,来确认表单数据是否合法(符合校验规则)。

>>> from inventory.forms import ItemForm

>>> f=ItemForm({'ItemCode': u'','ItemName':u'螺丝钉'})

>>> f.is_valid()

True

>>>

  如果初始化参数留空ItemCode或ItemName,整个Form就不合法了,如下:

>>> f=ItemForm({'ItemCode': u''})

>>> f.is_valid()

False

>>>

  每一个Form实体都有一个errors属性,它为你提供了所有字段与对应错误消息相映射的字典表。

>>> f.errors

{'ItemName': [u'This field is required.']}

>>>

  如果一个Form实体的数据是合法的,它就会有一个可用的cleaned_data属性。 这是一个包含干净的提交数据的字典。 Django的form框架不但校验数据,还会把它们转换成相应的Python类型数据格式。

>>> f=ItemForm({'ItemCode': u'','ItemName':u'螺丝钉'})

>>> f.is_valid()

True

>>> f.cleaned_data

{'ItemCode': u'', 'ItemName': u'\u87ba\u4e1d\u9489', 'Remark': u''}

>>>

7.2. 在视图中使用Form对象

  下示例说明了我们如何用forms框架实现AddItem ():

def AddItem(request):

  if request.method == 'POST':

    form = ItemForm(request.POST)

  if form.is_valid():

    cd = form.cleaned_data

    item = Item()

    item.ItemCode = cd['ItemCode']

    item.ItemName = cd['ItemName']

    item.save()

    return HttpResponseRedirect('/success/')

  else:

    form = ItemForm( )

    return render_to_response('ItemAdd.html', {'form': form},

            context_instance = RequestContext(request))

  模板文件ItemAdd.html:

<html>

<head>

<title>Add Item</title>

</head>

<body>

<h1>Add Item</h1>

{% if form.errors %}

<p style="color: red;">

Please correct the error{{ form.errors|pluralize }} below.

</p>

{% endif %}

<form action="" method="post">

{% csrf_token %}

<table>

{{ form.as_table }}

</table>

<input type="submit" value="Submit">

</form>

</body>

</html>

  代码看上去是多么的简洁明了,Django的forms框架处理了HTML显示、数据校验、数据清理和表单错误重现,让原来复杂的表单代码简洁了很多。下面我们简要说明forms框架可以做那些事情。

7.2.1. 改变字段显示
class ItemForm(forms.Form):

ItemCode = forms.CharField()

ItemName = forms.CharField()

Remark = froms.CharField( widget=forms.Textarea )

7.2.2. 设置最大长度
class ItemForm(forms.Form):

ItemCode = forms.CharField(max_length=10 )

ItemName = forms.CharField()

Remark = froms.CharField( widget=forms.Textarea )

7.2.3. 指定标签和修改错误提示
class ItemForm(forms.Form):

  ItemCode = forms.CharField(

  max_length=10

  label=u'物料编码:',

  error_messages={'required': u'必填项'},

  )

  ItemName = forms.CharField(

  label=u'物料名称:',

  )

  Remark = forms.CharField( required=False,widget=forms.Textarea,label=u'备注:', )

7.2.4. 定制Form设计

  我们可以使用CSS更精确控制表单显示,自动生成的错误列表精确的使用 <ul class=”errorlist”>`,我们就可以针对它们使用CSS,下面的CSS让错误更加醒目了:

<style type="text/css">

ul.errorlist {

margin: 0;

padding: 0;

}

.errorlist li {

background-color: red;

color: white;

display: block;

font-size: 10px;

margin: 0 0 3px;

padding: 4px 5px;

}

</style>

7.3. 使用Form类优化入库表单

  下面是我们用Form类优化的入库单功能,代码如下:

class InStockBillForm(forms.Form):

  InStockBillCode = forms.CharField()

  Operator = forms.CharField()

  InStockDate = forms.DateTimeField()

  Amount = forms.IntegerField()

  Item = forms.ModelChoiceField(queryset = Item.objects.all(),

  required =True)

 

  注意:Item属性设置成下拉选择字段类型,数据集为所有的Item对象。

def AddInStockBill(request):

  if request.method == 'POST':

  form = InStockBillForm(request.POST)

  if form.is_valid():

    cd = form.cleaned_data

    inStockBill = InStockBill()

    inStockBill.InStockBillCode = cd['InStockBillCode']

    inStockBill.InStockDate = cd['InStockDate']

    inStockBill.Amount = cd['Amount']

    inStockBill.Operator = cd['Operator']

    inStockBill.Item = cd['Item']

    inStockBill.save()

    return HttpResponseRedirect('/success/')

  else:

    form = InStockBillForm()

    return render_to_response('InStockAdd.html',{'form': form}

    ,context_instance = RequestContext(request))

  对比前面的AddInStockBill函数代码,会发现减少了大量的if判断语句,代码变得非常简洁易读。

  模板代码如下:

<html>

<head>

<title>Add In Stock Bill</title>

</head>

<body>

<h1>Add In Stock Bill</h1>

{% if form.errors %}

<p style="color: red;">

Please correct the error{{ form.errors|pluralize }} below.

</p>

{% endif %}

<form action="/AddInStockBill/" method="post" >

{% csrf_token %}

<table>

{{ form.as_table }}

</table>

<input type="submit" value="Submit">

</form>

</body>

</html>

  浏览网页发现Item的下拉列表没有出现ItemName的值,在Model里增加__unicode__() 方法可以进行任何处理来返回对一个对象的字符串表示,如对象名称。

class Item(models.Model):

  ItemId = models.AutoField(primary_key=True)

  ItemCode = models.CharField(max_length=50)

  ItemName = models.CharField(max_length=50)

  Remark = models.CharField(max_length=200)

  def

__unicode__(self): return self.ItemName

7.4. 小结

  Django表单类确实可以很大程度上简化表单的开发工作,提高了表单开发效率,其内置了大量的可自定义显示设置项目等,使用Django Form在某些使用场景会大大的减少工作量。

  本章结束时,我们完成了Django的基本使用,更多Django的介绍请请参考《The Django Book》网站。
  下一章节我们进入到IDE的使用,介绍2款主流的集成开发环境,而不是总是通过NotePad来进行代码编辑工作,提高开发的效率。

Python开发入门与实战7-Django Form的更多相关文章

  1. Python开发入门与实战12-业务逻辑层

    12. Biz业务层 前面的章节我们把大量的业务函数都放在了views.py里,按照目前这一的写法,当我们编写的系统复杂较高时,我们的views.py将会越来越复杂,大量的业务函数包含其中使其成为一个 ...

  2. Python开发入门与实战1-开发环境

    1.搭建Python Django开发环境 1.1.Python运行环境安装 Python官网:http://www.python.org/ Python最新源码,二进制文档,新闻资讯等可以在Pyth ...

  3. Python开发入门与实战8-基于Java的集成开发环境

    8. 基于Java的Python的集成开发环境 目前为止我们所有的代码和例子都是通过Notepad文本编辑器来实现的,实际项目开发中这种编码模式效率较低(大虾除外),使用IDE集成开发环境常常大幅度的 ...

  4. Python开发入门与实战18-Windows Azure 虚拟机部署

    18. 微软云虚拟机部署 上一章节我们介绍了如何在新浪云部署我们的在python django应用,本章我们来介绍如何Windows Azure上部署我们的应用. 18.1. 注册Windows Az ...

  5. Python开发入门与实战16-APACHE部署

    16. Windows平台apache部署 本章节我们简要的描述一下如何在windows平台部署apache的django站点. Python Django 项目部署发布到windows apache ...

  6. Python开发入门与实战2-第一个Django项目

    2.第一个Django项目 上一章节我们完成了python,django和数据库等运行环境的安装,现在我们来创建第一个django project吧,迈出使用django开发应用的第一步. 2.1.创 ...

  7. Python开发入门与实战13-基于模板的界面

    13. 基于模板的界面 本章我们将继续基于库存的简单例子来阐述如何在python django中体现MVC的架构,根据djangobook说明: M:数据存取部分,由django数据库层处理,本章要讲 ...

  8. Python开发入门与实战14-基于Extjs的界面

    14. 基于Extjs的界面 上一章我们实现了一个原生的html例子,本章我们将采用Extjs实现界面的展现,来说明MVC模式下我们是怎么考虑界面与业务层的关系的. 14.1. 引用Extjs目录 首 ...

  9. Python开发入门与实战10-事务

    1. 事务 本章我们将通过一个例子来简要的说明“事务”,这个开发实战里经常遇到的名词.事务是如何体现在一个具体的业务和系统的实现里. 事务是通过将一组相关操作组合为一个,要么全部成功要么全部失败的单元 ...

随机推荐

  1. SQL标签

    SQL标签库提供了与关系型数据库进行交互的标签. 引入语法:<%@ taglib prefix="sql" uri="http://java.sun.com/jsp ...

  2. php + Bootstrap-v3-Typeahead 自动完成组件的使用

    Bootstrap 中的 Typeahead 组件就是通常所说的自动完成 AutoComplete,类似百度.谷歌等搜索提示:输入关键词出现相应的下拉列表数据. 是Bootstrap-3-Typeah ...

  3. Prince2是怎么考试的?

    Prince2是怎么考试的? 在前几年,对于项目经理来讲关注的很多是单项目管理的工具技术模板,谈论最多的是,进度延期,成本超支,范围蔓延等等!有一个不成文的形态就是--去考个PMP吧!一时间PMP成为 ...

  4. 普华永道高级JAVA面试记录

    最近在考虑换个工作 原因?咱能不逗吗? 一面感觉发挥不错  二面之后累觉不爱  基本上浪费了半天的工资(好多钱啊~~~) PWD上海地址在浦东软件园  工作环境说实话没我现在工作的环境好,不过里面的人 ...

  5. Sharepoint2013切换用户菜单

          Sharepoint2013中没有切换用户的菜单,每次登录后,浏览器就会记住密码.要重新换一个用户登录的时候,就需要把浏览器都关闭,然后重新启动.这样非常不方便.特别是在测试权限这一块的时 ...

  6. Unity碰撞器触发关系测试

    本文刚体有关的内容不再赘述,主要测试碰撞器和触发器的消息关系. 刚体在这篇有测试:U3D刚体测试1-刚体非刚体物体非Kinematic等之间的碰撞关系 碰撞器测试结果: 1.A对象为Collider, ...

  7. JAVA基础知识之JDBC——JDBC事务处理及批量更新

    JDBC事务 JDBC的事务由Connection提供,默认是打开的. 要开启事务,则要关闭自动提交, conn.setAutoCommit(false); 提交事务使用 conn.commit(); ...

  8. ios html5 网页取消默认样式

    ios的的默认样式修改成扁平化的样式 重要的一句css  -webkit-appearance: none;  将样式清除 单数会出现将raido的选择按钮也会消失 所以需要对radio的样式进行重新 ...

  9. python(七)字符串格式化、生成器与迭代器

    字符串格式化 Python的字符串格式化有两种方式:百分号方式.format方式 1.百分号的方式 %[(name)][flags][width].[precision]typecode (name) ...

  10. python文件和目录操作方法大全(含实例)

    一.python中对文件.文件夹操作时经常用到的os模块和shutil模块常用方法.1.得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd()2.返回指定目录下的所有文件和目 ...