收藏 分销(赏)

PythonWeb开发基础教程 第7章 表单.pdf

上传人:曲**** 文档编号:225142 上传时间:2023-03-08 格式:PDF 页数:55 大小:1.33MB
下载 相关 举报
PythonWeb开发基础教程 第7章 表单.pdf_第1页
第1页 / 共55页
PythonWeb开发基础教程 第7章 表单.pdf_第2页
第2页 / 共55页
PythonWeb开发基础教程 第7章 表单.pdf_第3页
第3页 / 共55页
PythonWeb开发基础教程 第7章 表单.pdf_第4页
第4页 / 共55页
PythonWeb开发基础教程 第7章 表单.pdf_第5页
第5页 / 共55页
点击查看更多>>
资源描述

1、Python Web开发基础教程(Django版)第7章表单本章主要内容:,表单基础,Django表单进阶 模型表单资源Ajax7.1表单基础本节主要内容HTML表单 Django 表单7.1.1 HTML 表单 一个典型的HTML表单如下。label foXdata,请输入数据:v/label input type=submit value二“提交“,该表单由静态HTML实现,要直接在浏览器中访问该表单,需将其放在Django项目的static文件夹币。静态资源配置的详细内容请参考2.L4节。个表单主要包括提交地址、请求方法和表单元素三个 部分。表单的action属性指定的URL为提交地址,

2、它接收表单数 据,并执行相应的处理。表单的method属性指定请求方法,通常是GET或POST。通常在不改变服务器数据时用GET方法,提交的数据 会显示在URL中。要改变服务器数据时用POST方法,提交的数据封装在消 息栋中。-qango项目的模板文件是一个HTML文件,可在其中定义HTML表单。可通过视图将数据传递给 横板,然后使用模板变量将其填充到HTML表单。Django模板中的HTML表单典型结构如下。,%csrf_token%,请输入数据:,input type=submit value=提交 个current_data 变量。相比于前面的HTML表单,模板中多了一个%csrf_to

3、ken%标签和一将此模板(temform.html)放在项目的templates文件夹中,以便在视图中使用。,默认情况下,必ango会对所有的POST请求执行CSRF(跨站点请求伪造)保护。%csrf_token%标签用于获敢CSRF令牌,如果没有该标签,Django会拒绝表单请求。current_data 用于将视图传递给模板的数据插入到当前位置。7.1.2 Django 表单,模板中的HTML表单属于静态编码,要改变表单就必须修 改模板。Djang9表单通过扩展django.forms.Form类可在视图中动 态生成表单。使用Django表单的基本步骤包括:定义表单类 定义使用表单类和模板

4、的视图 定义表单模板 配置URL访问视图1.定义表单类#c h a pte ryc h a pte ryv i e ws.py from django import forms,class dataForm(forms.Form):data=forms.CharField(label=请输入数据)自定义的表单类dataForm继承了django.forms.Form类,它包含一个data字段。字段 data 的类型为forms.CharField。表单data字段会被渲染为一个label元素和一个input元素。表单字段的label参数指定在表单渲染生成的label元素中显示的字符串。2.定义

5、使用表单类和模板的视 在视图中需要创建表单类的实例对象,并将其作为参数传递给模板,代码如下。,def useDataForm(request):,if request.method=TOST1:form=dataForm(request.POST)#使用接收到的数据创建表单 msg二”已完成数据提交!”,else:,form=dataForm()#创建空白表单,msgJ初始表单,,return render(requestz temdataform-html,form1:form/msgimsg)在直接使用HTML表单时,视图将接收到的数据传递给模板,以便在响应页面中回显数据。在使用qjang

6、o表单时,视图使用接收到的数据创建表单,先将数据填入表单字段,再将表单对 象传递络模斐。3.定义表单模板 模板通过变量使用视图传递的表单对象,代码如下。%csrf_token%form input type=submit”value二“提交“msg4.配置URL访问视图 URL配置代码如下。from django.urls import path from.import views u ripatterns=pathCdform/,views.useDataForm),7.2 Django表单进阶本节主要内容 表单字段渲染方式 表单字段类型和参数,使用小部件 字段校验.使用表单数据 手动渲染字

7、段 遍历字段 表单集7.2.1表单字段渲染方式 Django提供了 3种表单字段渲染方式。(form.as_table:表单式样式,默认方式。将字段渲染为 包装在表格tr元素中的表单元素。-form.as_p 段落样式,将字段渲染为包装在p元素中的段落。form.as_ul:列表样式,将字段渲染为包装在元素中 的列表项。7.2.2表单字段类型和参数 表单字段的定义包含字段名、字段类型和字段参数3个部分,示例如下。class dataForm(forms.Forin):data=forms.CharField(label=请输入数据)#定义表单字段 其中,data为字段名,字段渲染生成的labe

8、l元素的for属性值为id_data”,生成的input元素的name属桂值为“data”、id庸性值为id_data”。CharField为字段类型,label为字段参数。一 django.forms模块定义了一系列字段类来描述表单字段的类型。字段类型决定了Django如何执行下列操作。字段被渲染成哪种HTML表单元素。是否必须为字段提供数据。默认情况下,所有类型的字段都必须提交数据。如何校验字段数据。如何将数据规范化为Python数据。表7-1常用表单字段类字段类默认渲染成的表单兀素Python数据的类型BooleanFieldCheckboxinputTrue 或 FalseCharFi

9、eldTextinput字符串ChoiceFieldSelect字符串DateFieldDateinputdatetime.dateTimeFieldTimeinputdatetime.timeDecimalFieldNumberinput(未本地化时)或TextinputdecimalFloatFieldNumberinput(未本地化时)或TextinputfloatIntegerFieldNumberinput(未本地化时)或Textinputinteger默认渲染成的表单元素Python数据的类型字段类EmailFieldEmailinput字符串FileFieldClearableF

10、ilelnput上传的文件FilePathFieldSelect字符串ImageFieldClearableFilelnput上传的图片文件GenericIPAddressFieldTextinput字符串MultipleChoiceFieldSelectMultiple字符串列表RegexFieldTextinput字符串UUlDFieldTextinputUUID1.required默认情况下,所有类型的表单字段的required属性值 均为True,即必须为字段提供数据。如果提供的是 None或空字符串,校验数据时会触发ValidationError 异常。表单字段的clean。方法用于

11、执行数据清理操作,验证 数据的有效性。数据有效时,clean。方法会返回该数 据,否则触发ValidationError异常。2.labellabel参数用于设置表单字段被渲染为HTML 元素时的文本内容,示例代码如下。,class test(forms.Form):,.name二forms.CharField(label=请输入姓名)print(test(),请输入姓名:在创建表单时,可使用auto_id=False来简化渲染结果,示例代码如下。,d=test(auto_id=False)print(d)请输入姓名:3.label suffix label_suffix属性用于设置表单字段被

12、渲染为HTML 元素丽的文本内容的后缀,默认后缀为英文冒号“:,示例代码如下。class test(forms.Form):.addr二forms.CharField(label=联系地址)label_suffix=print(test()Milt*4.initial initial参数用于设置字段的初始值,示例代码如下。class test(forms.Form):.name=forms.CharField(initial=,someone1)print(test(auto_id=False)Name:也可在创建表单对象时提供初始值,示例代码如下。d=test(,name,:,Lining,

13、/autoJd=False)print(d)Name:5.help_text help_text参数用于设置字段的帮助信息,帮助信息被渲染为 元素,示例代码如下。class test(forms.Form):,name=forms.CharField(help_text=姓名包含字母、数字等字符)print(test(auto_id=False)Name:tdxinput type=text name=name requiredxbrxspan classhelptext11姓名包含字母、数字等字符 6.error_messages errojmessages用于设置自定义错误信息,它将覆盖默

14、认的错误信息。error_messages的参数值为字典对象,其中的每个键值对对应一条校 验错误信息,示例代码如下。name=forms.CharField(error_messages=frequiredT必须提供name字段数 据T)name.clean()#验证字段取空值,触发异常 Traceback(most recent call last):django.core.exceptions.ValidationError:必须提供name字段数据口7.disableddisabled参数被设置为True时,不允许表单字段渲染成的 HTML元素与用户交互,示例代码如下。class tes

15、t(forms.Form):.addr=forms.CharField(label=联系地址:disabled=True)print(test()trvlabel foricLaddr11联系地址:v/labelv/thvtdvinput type=,text name=,addr required disabled id=,id_addr7.2.3使用水部件表单字段的widget参数用于指定渲染字段时使用的小部 件(也称组件),示例代码如下。class test(forms.Form):name=forms.CharField(widget=forms.Textarea)print(test

16、()Name:表7-2常用水部件小部件输入类型渲染结果Textinput文本Numberinput数字EmailinputE-mail地址URLInputURLPasswordinput用于输入密码Hiddenlnput隐藏的表单元素Dateinput日期字符串DateTimelnput日期时间字符串Timeinput时间字符串Textarea长文本.Checkboxinput复选框Select选项列表.NullBooleanSelect类似Select选项为Unknown、Yes和No的selectSelectMultiple类似Select,可多选.RadioSelect单选按钮组包含在l

17、i元素中的单选按钮组CheckboxSelectMultiple复选框 .Fileinput文件上传SelectDateWidget日期选项列表封费了3个Select来选择年、月、日。可用years和months参数指定 年份和月份选项7.2.4字段校验通常,Django根据字段类型执行默认的校验操作。例如,默认所有表单字段的required属性为True,字 段不接受空值。,表7-3列出了表单字段除了 required之外的其他校验操 作。表7-3常用表单字段类与校骑操作字段类校验操作错误信息关键字BooleanField验证给定值是否为TruerequiredCharField根据maxe

18、ngth和minength选项设置校验最大、最小长度required max_length min_lengthChoiceField验证给定值是否包含在选项列表中required invalid_choiceDateField验证数据是否为datetime.date、datetime.datetime或日期格式的字符串required invalidTimeField验证数据是否为datetime.time或时间格式的字符串required invalidDecimalField验证数据是否为小数。根据max_value和min_value设置校验最大值、最小值required invali

19、d、max_value min_value max_digits max_decimal_places、max_whole_digitsFloatField验证数据是否为浮点数。根据max_value和min_value设置校验最大值、最小值required invalid、max_value、min_valueIntegerField验证数据是否为整数。根据max_value和min_value设置校验最大值、最小值required invalid、max_value min_valueEmailField验证数据是否为有效的电子邮件地址required invalidFileField根据

20、maxength和allow_empty_file设置验证最大长度和是否允许空文件required invalid、missing empty maxjengthFilePathField验证数据是否包含在选项列表中required invalid_choiceImageField验证是否上传了图片文件required invalid、missing empty invalid_imageGenericIPAddressField验证数据是否为有效的IP地址required invalidMultipleChoiceField验证数据是否存在于选项列表中required invalid_cho

21、ice、invalid_listRegexField验证数据是否与某个正则表达式匹配required invalidUUlDField验证数据是否为有效的UUID字符串required invalid7.2.5使用表单数据通常,request.POST包含了表单采用POST请求方法 提交的数据。,request.POST中的数据没有被转换为Python类型,也 没有经过校验。,表单通过校验时,is_valid()函数返回True。,表单中通过校验的数据被包含在cleaned_data字典中。在使用表单数据时,应尽量使用cleaned_data小的数 据。1.绑定表单设置了数据的表单称为绑定表单

22、(is_bound属性为True),没有数据的表单称为未绑定表单(is_bound属性为False)。例如:class test(forms.Form):.name=forms.CharField(max_length=5O).age=forms.lntegerField(max_value=5O)d=test()d.is_boundFalse d=test()d.is_boundTrue destCfnamezmike/ageo)#绑定具体数据 d.is_bound#创建空表单#结果为False,说明表单未绑定#绑定空值时,表单也被绑定#结果为True,说明表单已绑定True应注意,在定义表

23、单时为字段设置的初始值,只用于在表单字段被渲染为HTML元素 时设置元素的初始值。即使有初始值,空表单仍是未绑定的,示例代码如下。class test(forms.Form):.name=forms.CharField(max_length=5O/initial=lnonamel).age=forms.lntegerField(max_value=5/initial=2)d=test()d.is_bound False#创建空表单#结果为False,说明表单未绑定2.使用“干净的”数据调用表单is_valid()方法时会执行数据校验,当所有字段数 据均合法时,方法返回True,否则返回Fals

24、e。,执行校验时,Django为表单对象创建cleaned_data属性。通过校验的数据是“干净的”,被保存在表单的 cleaned_data 属性中。,cleaned_data属性只能在执行校验之后访问,否则会触发 Attrib ute Error异常。7.2.6手动渲染字段在表单模板中,可以使用form、form.as_table form.as_p和form.as_ul等奏量莪得表单字段而默 认渲染效果,详见72工节。Django允许在表单模板中自定义表单字段的渲染效果。在模板中,用form.字段名格式来访问表单字段。7.2.7追历字段在表单模板中,也可用%。循环来遍历表单字段。表 单字

25、段的常用属性如下。form.字段名.label:字段的label文本,例如,一“姓名”。form.字段名.label_tag:封装在HTML 元素中的label文 本,包含表单的label_suffixo form.字段名.value:字段值。form.字段名.help_text:字段的帮助文本。form.字段名.errors:字段未通过验证时的错误信息。&f?rrp.字段名.field:表单字段的BoundField实例对象,用于 访问字段属性。例如,form.name.field.max_length。7.2.8表单集,表单集是表单对象的集合,用于处理多个表单。可调用django.form

26、s模块提供的formset_factory()工厂类方法创建表单集类,示例代码如下。classTestFormset=formset_factory(test;extra=2)#仓4 建表单集类 test参数为自定义的表单类。extra参数指定表单集中包含的表单个数,默认为1 创建了表单集类后,就可用其来创建表单集对象,示例代码如下。,formset=classTestFormset(request.POST)#使用客户端数据初始化表单集,formset=classTestFormset()#创建空白表单集 在视图函数中,可将表单集对象传递给模板,示例代码如下。def useFormset(r

27、equest):classTestFormset=formset_factory(test,extra=2)#仓|健表单集类,if request.method=POST:,formset=classTestFormset(request.POST)else:formset=classTestFormset()return render(request,temformset.htmr,formset:formset)#将表单集传递给模板7.3模型表单本节主要内容 模型表单基本操作 在视图中使用模型表单 自定义模型表单字段7.3.1模型表单基本操作模型表单指绑定到模型的表单。自定义的模型表单需

28、扩展django.forms模块提供的ModelForm类。模型表单基本操作包括定义模型、定义模型表单以及 使用模型表单为数据库添加和修改数据。1,定义模型 模型代码如下。#chapter7chapter7models.py from django.db import models class person(models.Model):name=models.CharField(max_length=8)age=models.Small IntegerFieldQ 用于模型表单的模型与普通模型并没有任何区别。2.定义模型表单模型表单代码如下。#chapter7chapteryviews.py

29、from django.forms import ModelForm from models import personclass personForm(ModelForm):class Meta:model=person fields=name,age 模型表单有两个特点:必须继承 django.forms.ModelForm 类。,提供子类Meta。在Meta的model字段中绑定模型,在fields字段 中设置在表单中使用的模型字段。可以使用特殊值_all_表示使用模型全部字段,示例代码 如下。fields=1all1,也可使用exclude属性来排除不使用的字段,示例代码如下。excl

30、ude=age13.使用模型表单为数据库添加数据首先使用数据作为参数来创建模型表单,再调用表单的save()方法将数据写入数据库,示例代码如下。from chaptery.models import person from chaptery.views import personForm one=personForm(name:张三age:25)one.save()d=person.objects.all()o d.name,d.age(张三,25)#用初始化数据,创建模型表单对象#保存表单#获取数据库中的第1条记录,#查看数据调用save。方法时,会将数据写入数据库,同时返回包含数据的模型对

31、象。4.使用模型表单修改数据库记录 在创建模型表单对象时,可使用instance参数指定模型对象,save。方法使用模型表单的数据修改模型对象,从而 修改其关联的数据库记录,示例代码如下。,p=person.objects.get(id=i)#获取模型对象 p.name,p.age#查看数据(张三,25)one=personForm(namel:,H/,agel:3o,instance=p)#创建关联模型对象的模型表单 one.save()#保存表单,p=person.objects.get(id=i)p.name,p.age(,李四,30)#通过模型对象查看修改后的数据7.3.2在视图中使用

32、模型表单 在视图中,可用request.POST作为参数来创建模型表单对象,再通过模型表单对象将数据添加到数据库或者修改现有记录 视图在使用POST方法请求时,视图通过request.POST获得客户 端提交的数据。将request.POST作为参数初始化表单,执行表单验证操作,可 检查裴据是否有效。在数据有效时,用客户端提交的姓名作为条件执行查询。当教拂序中不存在相同姓名时,执行表单保存操作,将数据写 入数据库。在浏览器中访问视图URL时,请求方法为GET,此时视图返回 空白表单。def usePersonForm(request):if request.method=POST1:#提交表单

33、时采用POST方法,此时处理数据,mform=personForm(request.POST)#用提交的数据初始化表单 if mform.is_valid():#在表单通过验证时执行数据处理 ps=person.objects.filter(name=request.POST,name1)#用表单数据查询 if ps.count()=o:,mform.save()#不存在相同姓名时,将数据添加到数据库 msg=数据已保存!,else:-msg=,数据库已存在相同姓名的数据,请勿重复提交!,else:mform=personForm()#创建空白表单 msg=请输入数据添加新记录return r

34、ender(request,temmodelform-html,mform:mform/msgimsg)7.3.3自定义模型表单字段通常情况下,模型表单字段与模型字段保持一致。Django允许在模型表单中覆盖模型字段定义def validate_age(value):if int(value)50:raise ValidationErrorC年龄不能大于50!,/code=max_value,)class personFormDIY(ModelForm):#重定义age字段age=forms.CharField(validators=validate_age/label=,/widget=fo

35、rms.Numberlnput(),help_text=年龄为20,50以内的整数,)class Meta:model=personfields=name,agelabels=name:姓名help_texts=fname?姓名为中英文字符串widgets=name:forms.Textarea(attrs=cols:30,rows:2),#定义模型表单#指定模型#指定字段#设置字段渲染后的label内容#设置字段帮助文本#设置字段小部件7.4资源资源指应用于表单的CSS和JavaScript文件。当定义表单或小部件时,可以在Media子类中为其定 义资源。在渲染表单时,Django会将资源文

36、件包含到 HTML 中。本节主要内容小部件资源,表单资源7.4.1小部件资源通过扩展小部件定义表单资源的基本格式如下。class自定义小部件类名称(forms.内置小部件类名称):class Media:设备类型“CSS资源文件URL),js=JavaScript资源文件URL)Media子类的css属性用于设置CSS资源。css属性中的键设置CSS资源中的样式单适用 的设备类型资源文件的URL可以使用相对路径或绝对路径。CSS和JavaScript资源文件属于静态资 源,通常将其放在项目的static文件夹中。关于静态资源配置瘁情请参考本书2.1.4节。可用的类型名称如下。all:默认。适用

37、于所有设备。aural:语音合成器。braille:盲文反馈装置。handheld:手持设备。projection:投影仪。,print:打印预览模式或打印页面。,screen:计算机屏幕。tty:电传打字机以及类似的使用等宽字符网格的设备。-tv:电视机类型设备。小部件资源通过实例对象的media属性来访问,其被渲染为clink元素。例如,下面的代码扩展了Textinput组件,为其定义了CSS资源。class myTextlnput(forms.Textlnput):.class Media:.css=air:(/static/diyform.css,)text=myTextlnput()

38、print(text.media)当表单使用了带有资源的小部件时,也可通过表单对象的 media属性获得资源,示例代码如下。class test(forms.Form):name=forms.CharField(widget=myTextlnput)a=test()print(a.media)7.4.2表单资源可以在表单的Media子类中定义资源,其语法规则与小部 件中的Media子类的规则相同。添加表单资源定义,代码如下。class personFormDIY_Media(ModelForm):class Media:css=lalll:(Vstatic/diyforin.css1,)1js

39、=C/static/focusinputjs1,)7.5 Ajax为ax用于在不刷新整个页面的情况下,在后台将数据提交给服 M器,再使用服务器返回的数据更新局部页面。通常,要使用Ajax需要一个客户端Web页面和一个或多个服务 器端脚本。在Django中,客户端Web页面和服务器端脚本均可用视图来实 凯。本节主要内容实现客户端Web页面处理请求7.5.1实现客户端Web页面 客户端Web页面的具体实现包括定义模板、定义视图 和URL酉己置。-1.定义模板 2.定义视图 3.URL配置7.5.2处理请求,在模板文件temajax.html中,Ajax请求的URL为“/getinfo/,所以需要配置该URL来访问具体处理 请求的视图。7.6实践:实现用户注册本节主要内容

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 考试专区 > 人力资源管理师考试

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服