python django 表单_Python开发入门与实战7-Django Form

7. Django Form

7.1. Form表单

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

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

classItemForm(forms.Form):

ItemCode=forms.CharField()

ItemName=forms.CharField()

Remark= froms.CharField(required=False)

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

>>> from inventory.forms importItemForm>>> f=ItemForm({'ItemCode': u'005','ItemName':u'螺丝钉'})>>>f.is_valid()

True>>>

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

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

False>>>

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

>>>f.errors

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

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

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

True>>>f.cleaned_data

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

7.2. 在视图中使用Form对象

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

defAddItem(request):if request.method == 'POST':

form=ItemForm(request.POST)ifform.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:

Add Item

Add Item

{% if form.errors %}Please correct the error{{ form.errors|pluralize }} below.{% endif %}{% csrf_token %}

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

e3faf02b0d57536f3dda74020d2fedcf.png

7.2.1. 改变字段显示

classItemForm(forms.Form):

ItemCode=forms.CharField()

ItemName=forms.CharField()

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

f9067f26d2d5ee6a1db706ecba73b602.png

7.2.2. 设置最大长度

classItemForm(forms.Form):

ItemCode= forms.CharField(max_length=10)

ItemName=forms.CharField()

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

112c5bd814dea5e6304014238622ef83.png

7.2.3. 指定标签和修改错误提示

classItemForm(forms.Form):

ItemCode=forms.CharField(

max_length=10label=u'物料编码:',

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

)

ItemName=forms.CharField(

label=u'物料名称:',

)

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

d00c7d0f02c7bb12e00b65fc6fa95010.png

7.2.4. 定制Form设计

我们可以使用CSS更精确控制表单显示,自动生成的错误列表精确的使用

  • `,我们就可以针对它们使用CSS,下面的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;

}

d22a16b06cd66ca92b3356073f808ea1.png

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

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

classInStockBillForm(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对象。

defAddInStockBill(request):if request.method == 'POST':

form=InStockBillForm(request.POST)ifform.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判断语句,代码变得非常简洁易读。

模板代码如下:

Add In Stock Bill

Add In Stock Bill

{% if form.errors %}Please correct the error{{ form.errors|pluralize }} below.{% endif %}{% csrf_token %}

8761b7307d7649c610f8dbd5124058fa.png

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

classItem(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

36bc7cc1c6329aa0e333958e153ec90f.png

7.4. 小结

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

本章结束时,我们完成了Django的基本使用,更多Django的介绍请请参考《The Django Book》网站。

下一章节我们进入到IDE的使用,介绍2款主流的集成开发环境,而不是总是通过NotePad来进行代码编辑工作,提高开发的效率。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值