目录

使用Form对象定义表单

Form对象的特性

表单字段的基类Field

常用的表单字段类型

基于Model定制的表单

ModelForm定义方式

表单中的常用方法


在Web站点中与后端服务进行交互,通常使用表单提交的方式。表单提交数据到达后端,首先要对数据做校验,对于不合法的数据需要拒绝并提示给前端,通过校验之后才能执行服务返回响应。由于所有的表单创建与处理流程都是相似的,所以,Django将这一过程抽象出来,形成表单系统。从在浏览器中显示表单到数据验证,再到对错误的处理,都可以由表单系统来完成。不仅如此,基于数据表(Model)创建表单也是很常见的情况,Django同样考虑到了这一点,并提供了ModelForm来简化功能实现。

使用Form对象定义表单

表单系统的核心是Form对象,它将表单中的字段封装成一系列Field和验证规则,以此来自动地生成HTML表单标签。

与其他对象的定义规则类似,可以将Form对象定义在任何位置。但是,Django的建议是将它们定义在应用下的forms.py文件中。这样做的原因是归类存储,

from django import formsclass titleform(forms.Form):title = forms.CharField(label='Topic title')

上面代码中,可以发现Form的定义与Model的定义非常相似,比较容易理解。这里的TopicSearchForm定义内容非常少。

  • Django规定,所有的Form对象都必须继承自django.forms.Form,所以这里的TopicSearchForm符合条件。
  • 定义了一个title属性,它是forms.CharField类型的Field,根据名称可以猜测此处将title指定为字符类型。label标签显式地指定了这个字段的名称,且Field有一个默认属性required为True,代表这个字段是必填的。

Form对象的特性

  • 实现对所有字段的验证

    • 每一个Form对象实例都会有一个is_valid方法,这个方法根据字段的定义验证实例的各个字段是否合法。如果所有的字段都是合法的,它会返回True,并且将数据存储到字典类型的cleaned_data属性中。
  • 根据字段定义生成HTML
    • 表单实例可以自动生成HTML表单元素,且默认输出使用HTML表格,但是并不提供<table>起始和结束标签。同时,也可以使用实例的as_ul方法获取列表形式的表单或使用as_p方法获取段落形式的表单。
    • 由于表单实例可以直接返回HTML表单元素,所以,可以用它来替换模板文件中的字段定义。更方便的是,在没有正确填充表单时,它还可以返回错误信息的提示。

表单字段的基类Field

基类Field定义于django/forms/fields.py文件中,这里重点关注它的构造函数中定义的属性以及校验给定字段值是否有效的clean方法。

  • required

    • 设定当前的Field是否是必须提供的,默认值是True,即必须提供。
  • widget
    • 指定在页面中显示字段的控件,可以是Widget类或者Widget类实例。对于大多数情况,默认的控件使用TextInput。
  • label
    • 指定在页面中显示的字段的名称(标签)提示。如果不指定的话,则页面中将直接显示字段定义的变量名(首字母大写)。
  • initial
    • 指定字段的初始值,默认为None。当给字段的initial属性设定一个非空值时,页面中的对应表单将使用这个值填充。
  • help_text
    • 用于给当前的字段添加描述性信息,提示当前字段的作用或需要输入的内容解释。如果设定了该属性,则其在页面中将会显示在旁边。
  • error_messages
    • 用于覆盖Field默认的错误消息。
  • disabled
    • 其默认值是False,如果修改为True,则当前的表单字段将不可编辑。当设置字段为不可编辑时,需要提供初始值(initial),否则,这个字段也就没有意义了。

常用的表单字段类型

Django表单系统内置了数十种表单字段类型,几乎可以满足所有的表单使用场景。如果这些内置的字段类型都不能满足所需的业务场景,Django也支持自定义Field类。

  • CharField

    • 其为字符串类型的表单字段,是最常见的表单字段类型,widget默认使用TextInput
    • max_length限制字段值的最大长度
    • min_length限制字段值的最小长度
    • strip属性默认会执行Python字符串的strip方法,用于去除字符串开头和尾部的空格。如果不需要这样做,可以将strip属性设置为False:
    • empty_value:用来表示"空"的值。默认为空字符串。
  • IntegerField
    • 其为整数类型的表单字段,widget默认使用NumberInput。
    • 可选的max_value与min_value参数用于限定字段值的取值范围,且它们都是闭区间。如果提供了这两个参数(或其中之一),且给定的字段值不在取值范围内,将会抛出异常,并带有错误提示信息。
  • BooleanField
    • 其为布尔类型的表单字段,widget默认使用CheckboxInput。
    • 由于基类Field的required属性默认是True,所以,在不做设置的情况下,BooleanField实例的required属性也是True。由于required为True要求这个字段值必须提供,所以,这种情况下,BooleanField类型的实例必须是True,否则将抛出异常,并提示:“This fieldis required.”。
    • 如果要在表单中使用BooleanField字段,则需要指定required为False:
  • ChoiceField
    • 其为选择类型的表单字段,widget默认使用Select。
    • choices参数需要一个可迭代的二元组或能够返回可迭代二元组的函数对象。与模型中的choices参数使用方法一样。
  • EmailField
    • 它继承自CharField,但是提供了Email验证器,用于校验传递的字段值是否是合法的电子邮件地址。widget默认使用EmailInput。
    • 除了EmailField之外,表单系统还提供了UUIDField、GenericIPAddressField、URLField等基于CharField的字段类型用于校验特定结构的字符串。
  • UUIDField
    • 与EmailField类似,不过它只会验证数据是否会空,并会自动将数据生成唯一列,并设置为主键
  • JSONField
    • 一个接受 JSON 编码数据的字段,验证给定值是否为有效的 JSON。
  • GenericIPAddressField
    • 与EmailField类似,不过是验证给定的值是一个有效的 IP 地址。
  • URLField
    • 与EmailField类似,不过是验证给定值是一个有效的 URL的。
  • DateTimeField
    • 用于表示时间的表单字段,widget默认使用DateTimeInput。
    • 接受一个可选的参数input_formats,这个参数是一个列表,列表元素规定了可以转换为datetime.datetime的时间格式。
    • DateTimeField的clean方法接受的值类型可以是datetime.datetime、datetime.date或符合特定格式的字符串,最终会返回datetime.datetime对象或抛出异常。

基于Model定制的表单

将Model翻译成表单是很常见的业务场景,利用Form对象并不难实现,只需要将Model中定义的字段翻译成Form对象中的表单字段即可。但是,如果这种需求很多,且Model中定义的字段也较多,那么重复实现这种表单的过程会很烦琐的。Django表单系统考虑到了这个问题,提供了ModelForm,可以基于Model的定义自动生成表单,很大程度上简化了Model翻译成表单的过程。译成表单字段类型,但是,并不会翻译所有的字段,editable=False的模型字段都不会出现在ModelForm中,如自增主键、自动添加的时间字段等。

ModelForm定义方式

class PrettyModelForm(forms.ModelForm):class Meta:model = models.PrettyNumfields = ["name", ]# fields = "__all__"# exclude = ['level']

上面代码中就是自动生成了models.PrettyNum模型中的name字段的表单。

常用的Meta选项

  • fields

    • 其为列表或元组类型,
    • 它指定当前的表单应该包含哪些字段,如果要所有的Model字段都包含在表单中,可以设定fields='__all__'。
    • ModelForm的定义中必须要包含fields或exclude选项,否则将会抛出异常,同时给出错误提示:Creating a ModelForm without eitherthe'fields'attribute or the'exclude'attribute isprohibited。
  • exclude
    • 与fields类似,不过是指向当前的表单不应该包含哪些字段,是与fields相反
  • labels
    • 其为字典类型,用于定义表单字段的名称(输入框左边显示的名称)。表单字段的名称首先会使用Model字段定义设置的verbose_name,如果没有设置,则直接使用字段名。因此当没有定义verbose_name时,就可以使用labels选项来指定字段名。
  • help_texts
    • 其为字典类型,用于给表单字段添加帮助信息。目前页面中表单字段的帮助信息(输入框下方显示的内容)来自Model字段的help_texts定义,如果没有定义则什么都不显示。help_texts的定义方式与labels选项类似,
  • widgets
    • 其为字典类型,用于定义表单字段选用的控件。默认情况下,ModelForm会根据Model字段的类型映射表单Field类,因此会应用Field类中默认定义的widgets。这个选项用于自定义控件类型
  • field_classes
    • 其为字典类型,用于指定表单字段使用的Field类型。默认情况下,对于title字段,ModelForm会将它映射为fields.CharField类型。可以根据需要改变这种默认行为

表单中的常用方法

  • is_valid()

    • 校验字段值的合法性
  • cleaned_data属性
    • 获取清理后的字段值
  • save()
    • 字段值通过校验(is_valid)之后,可以使用ModelForm提供的save方法实现Model对象的保存。
  • instance
    • 添加表单数据,如果有些数据是不需要用户输入的,需要后台自动生成则使用该方法。
    • form.instance.字段名 = 值
  • errors
    • 包含了表单的错误信息,这是一个属性,是一个列表格式
  • label
    • 表示表单的名字,是一个属性,由模型中verbose_name属性控制。
  • add_error
    • 添加表单错误信息。
    • form.add_error('字段名', '详细信息')
    • 表示会在该字段名的错误消息里添加详细信息

注意:使用ModelForm类时,需要先使用该类生成对象。如果需要获取使用ModelForm验证的数据则为:

form = PrettyModelForm(data=request.POST)

PrettyModelForm是类名

Django表单系统相关推荐

  1. django的表单系统

    1.概述: django表单系统中,自定义表单类都是以django.forms.Form为父类进行创建: django中的Form一般有两种功能: 生成特定的HTML标签 后台验证用户提交的数据 2. ...

  2. python django 表单_Django ModelForm与Form

    django表单系统中,所有的表单类都作为django.forms.Form的子类创建,包括ModelForm 关于django的表单系统,主要分两种 基于django.forms.Form 基于dj ...

  3. 7Python全栈之路系列之Django表单

    Python全栈之路系列之Django表单 从Request对象中获取数据 HttpRequest对象包含当前请求URL的一些信息: 熟悉/方法 描述 例如 request.path 除域名以外的请求 ...

  4. Web开发-Django表单

    Django表单 简述 虽然在Django的核心组件中没有看到表单的影子,但是熟悉Web开发的都知道,表单控制是至关重要的. 表单一般放在某个app目录下的forms.py文件中. 基本操作 表单绑定 ...

  5. Django从理论到实战(part48)--Django表单

    学习笔记,仅供参考,有错必纠 参考自:某网课 文章目录 Django表单 Django表单概述 HTML中的表单 Django中的表单 Django中表单使用流程 表单验证 常用的Field 常用验证 ...

  6. 填表统计预约打卡表单系统

    填表统计预约打卡表单系统是一款基于FastAdmin+ThinkPHP+UniApp开发的一款集信息填表.预约报名,签到打卡.活动通知.报名投票.班级统计等功能的自定义表单统计小程序. 体验链接 功能 ...

  7. Django 表单验证之自定义表单验证器

    本文基于Django 表单验证 一文,补充完善表单验证器之自定义表单验证器 具体步骤总结如下: 第一:在formValidation.py 文件中,添加自定义名称敏感验证器(NameValidatio ...

  8. django一个html先后两个form,Django教程(三)- Django表单Form

    目录: 1.Form 基本使用 django中的Form组件有以下几个功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 2.Form中 ...

  9. 一文告诉你什么是开源表单系统

    熟悉市场的人都知道,传统的表单存在效率低的瓶颈,无法满足当前很多企业的业务需求.开源表单系统也是顺应时代发展需求应运而生的产物,在提升企业办公效率和协作效率,推动企业数字化转型方面意义重大.今天这篇文 ...

  10. 【分享】用友U8无需API开发连接表单系统、CRM系统、数据库等第三方应用

    用友U8用户使用场景: 每当用友U8有存货修改时,需要仓库管理员查询存货档案详情,然后在钉钉宜搭上查询对应货品详情并进行修改,确保两个系统的信息统一,便于销售人员调整营销策略. 但整个流程耗费一定的时 ...

最新文章

  1. MySQL基础篇:数据类型
  2. 从未加入域的计算机上使用Windows验证方式访问SQL Server
  3. ADB 操作手机的粘贴板
  4. 百度地图描绘轨迹html,百度地图API 绘制轨迹历史
  5. 信号捕捉(signal、sigaction)
  6. python 百度识图_用python做图片识别(调用百度API)
  7. C# 禁止控件重绘(绘制)
  8. 被错误理解的人工神经网络(一)!
  9. 清除html中table标签显示的数据,遍历查看/新增/删除/获取html中table中的标签
  10. app 显示未验证应用解决
  11. 参加了iDOF2016会议,发表演讲“油田SOA与云平台的系统思考与实践”
  12. 有感,一些与自己同龄的文字
  13. 【SpringMVC】DispatcherServlet重要组件之一MultipartResolver
  14. CCRC信息安全服务资质
  15. 源文件如何一步步到可执行程序【程序员必修课】
  16. 陈艾盐:《春燕》百集访谈节目第三十七集
  17. git clone报错:SSL certificate problem: unable to get local issuer certificate
  18. 两款简单的拒绝服务攻击工具
  19. -2147483648是不是int常量
  20. JAVA根据模板导出PPTX

热门文章

  1. JVM内存模型及CMS、G1和ZGC垃圾回收器详解
  2. 魔兽争霸的地图验证漏洞和作弊图原理,兼谈魔兽联机机制[转载]
  3. 最全Mac系统快捷键一览
  4. Qt视频直播软件--项目实战(Day5)
  5. 人人都是产品经理总结 第一章
  6. 520套电商行业响应式html5模板b2c商城购物网站模板HTML5化妆品电商网站模板IT类电子商务商城购物企业网站模板html5网页静态模板Bootstrap扁平化网站源码
  7. 重庆北大青鸟【学员心声】任何一次的考试,都是一次珍贵的蜕变机会
  8. 手把手教你安装Sketch破解版和measure插件
  9. 将 azw3 格式转换为 epub和mobi 格式
  10. 编译原理 实验一 词法分析器设计