在通过django.forms.Forms创建表单字段时,其中每个字段都有一些自定义的验证逻辑和一些其他钩子

虽然表单字段的Field类主要使用在Form类中,但也可以直接实例化来使用它们,以更好的了解它们是如何工作的,每个Field的实例都有一个clean()方法,它接收一个参数,然后返回‘清洁的'数据或者抛出一个django.forms.ValidationError异常

Field.clean(value)

In [1]: from django import forms
#创建一个字段
In [2]: f = forms.CharField()
In [3]: f.clean('')
Out[3]: ''
In [4]: f.clean(1)
Out[4]: ''
#CharField字段如果没空则抛出异常
In [5]: f.clean('')
ValidationError Traceback (most recent call last)

clean()方法通常用来对数据进行验证和测试比较方便

核心字段参数:

每个Field类构造函数都可用这些参数

1、required

Field.required:默认情况下,Field类都必须判断字段的值不能为空值、None或者空的字符串(“”)那么clean()将会引发ValidationError异常;只有在字段设置参数required=False则该字段的值不是必须的即可用为空或None

In [6]: fr = forms.CharField()
In [7]: fr.clean(None)
---------------------------------------------------------------------------
ValidationError Traceback (most recent call last) In [8]: fq = forms.CharField(required=False)
In [9]: fq.clean(None)
Out[9]: ''
In [10]: fq.clean("")
Out[10]: ''

2、label

label参数用来给字段添加’人性化'的提示信息,如不指定则Field将所以下划线转换为空格并将第一个字母大写来生成标签

from django import forms
class CommentForm(forms.Form):
name = forms.CharField(label='your name')
url = forms.URLField(label='your website')
commnet = forms.CharField() f = CommentForm(auto_id=False)
#auto_id用来简化输出
print(f)
#comment字段未指定label参数则使用字段名生成
<tr><th>your name:</th><td><input type="text" name="name" required></td></tr>
<tr><th>your website:</th><td><input type="url" name="url" required></td></tr>
<tr><th>Commnet:</th><td><input type="text" name="commnet" required></td></tr>

3、label_suffix

django默认为label参数后面添加了冒号后缀,如果想自定义则可用使用label_suffix参数来指定替代符号

class conform(forms.Form):
name = forms.CharField(label='姓名')
rename = forms.CharField(label='姓名',label_suffix='==') f = conform(auto_id=False)
print(f)
<tr><th>姓名:</th><td><input type="text" name="name" required></td></tr>
<tr><th>姓名==</th><td><input type="text" name="rename" required></td></tr>

4、initial

该initial参数允许Field在未绑定中呈现此内容时要使用的初始值

from django import forms
class commentform(forms.Form):
name = forms.CharField(initial='your name')
url = forms.URLField(initial='http://')
comment = forms.CharField() f = commentform(auto_id=False)
print(f)
<tr><th>Name:</th><td><input type="text" name="name" value="your name" required></td></tr>
<tr><th>Url:</th><td><input type="url" name="url" value="http://" required></td></tr>
<tr><th>Comment:</th><td><input type="text" name="comment" required></td></tr>

如果在初始表单时传递数据将触发验证,HTML输出将包括任何验证错误信息,所以initial仅为未绑定表单数据时显示值

from django import forms
class commentform(forms.Form):
name = forms.CharField(initial='your name')
url = forms.URLField() data = {'name':"",'url':'http://www.baidu.com'}
f = commentform(data,auto_id=False)
print(f)
<tr><th>Name:</th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="name" required></td></tr>
<tr><th>Url:</th><td><input type="url" name="url" value="http://www.baidu.com" required></td></tr>

我们也可以传递任何可调用的变量作为参数传递给initial,如以下实例我们可以传递一个现在的时间给参数作为初始值

from django import forms
import datetime
class dateform(forms.Form):
day = forms.DateField(initial=datetime.date.today) print(dateform(auto_id=False))
<tr><th>Day:</th><td><input type="text" name="day" value="2019-04-10" required></td></tr>

5、widget

最重要的参数之一,指定渲染Widget时使用的widget类,也就是在form字段在HTML页面中是显示为文本输入框、密码框、单选按钮或多选框等,此参数内容比较多,以后单篇文章详细介绍

6、help_text

该参数用于设置字段的描述文本,它与模型字段中的hep_text一样,它不会再自动生成的表单中进行HTML转义

from django import forms

class HelptextForm(forms.Form):
name = forms.CharField(help_text='100 characters max.')
sender = forms.EmailField(help_text='a email address.') f = HelptextForm(auto_id=False)
print(f)
<tr><th>Name:</th><td><input type="text" name="name" required><br><span class="helptext">100 characters max.</span></td></tr>
<tr><th>Sender:</th><td><input type="email" name="sender" required><br><span class="helptext">a email address.</span></td></tr>

7、error_messages

该参数用于设置覆盖字段将引发的默认异常消息,需传入一个字典,其中的键与要覆盖的错误信息相匹配

#以下是默认的异常信息
generic = forms.EmailField()
generic.clean('')
django.core.exceptions.ValidationError: ['This field is required.']
#下面通过error_messages自定义默认的异常信息
name = forms.EmailField(error_messages={'required':'please enter your email'})
name.clean('')
django.core.exceptions.ValidationError: ['please enter your email']

8、validators

指定一个列表,其中包含为字段进行验证的函数,如,我们自定义了验证方法,不需熬Django内置的验证功能,那么久需要通过这个参数,将字段与自定义验证的方法通过此参数来指定

9、localize

此参数帮助我们实现表单数据输入的本地化

10、disabled

设置由该属性的字段在前端页面中将显示为不可编辑的状态

该参数接收布尔值,当设置为True时,使用HTML的disabled属性金庸表单域,使用户无法编辑该字段,即使非法篡改了前端页面的属性,相服务器提交该字段的值也将依然被忽略

11、has_changed()

该方法用于确定字段值是否已从初始值更改,返回True或False

内置Field类:对于每个字段类,下面介绍其默认的Widget,当输入为空值时返回的值,以及蚕蛹何种验证方法,‘规范化为'表示转换为python的何种对象,可用的错误信息键,表示字段可自定义错误信息的类型(字典的键)

12、BooleanField

默认的Widget:CheckboxInput
空值:False
规范化为:Python的True或者False
可用的错误信息键:required

13、CharField

默认的Widget:TextInput
空值:empty_value给出的任何值
规范化为:Python的string

验证max_length或min_length,如果设置了这两个参数,否则所有的输入都是合法的
可用的错误信息键:required,min_length,max_length

它有四个可选参数:max_length,min_length用来设置字符串的最大和最小长度;strip默认为True,去除输入的前导和尾随空格;empty_value用来表示'空'的值,默认为空字符串

14、ChoiceField

默认的Widget:Select

空值:一个空字符串

规范化为:python的string

验证给定的值是否在选项列表中

可用的错误信息键:required,invalid_choice

参数:choices用来作为该字段选项的一个二元组组成的可迭代对象

15、TypedChoiceField

同ChoiceField一样,只是多了两个额外参数corece和empty_value

默认的Widget:Select

空值:empty_value参数设置的值

规范化为:coerce参数类型的值

验证给定的值在选项列表中存在并且可以被强制转换

可用的错误信息的键:required,invalid_choice

16、DateField

默认的Widget:DateInput

空值:None

规范化为:datetime.date对象

验证给出的值时一个datetime.date,datetime.datetiem或指定日期格式的字符串

错误信息的键:required,invalid

接收一个可选的参数:input_formats,一个格式的列表,用于转换字符串为datetime.date对象,如果没有提供input_formats默认端输入格式为:

['%Y-%m-%d',    #'2019-4-10'
'%m/%d/%Y', #'4/10/2019'
'%m/%d/%y'] #'4/10/19'

此外,如果在设置中指定了USE_L10N=False,以下内容也将包含在默认格式中:

['%b %d %Y',      # 'Oct 25 2006'
'%b %d, %Y', # 'Oct 25, 2006'
'%d %b %Y', # '25 Oct 2006'
'%d %b, %Y', # '25 Oct, 2006'
'%B %d %Y', # 'October 25 2006'
'%B %d, %Y', # 'October 25, 2006'
'%d %B %Y', # '25 October 2006'
'%d %B, %Y'] # '25 October, 2006'

17、DateTimeField

默认的Widget:DateTimeInput

空值:None

规范化为:python的datetime.datetime对象

验证给出的值时一个datetime.datetime、datetime.date或指定日期格式的字符串

错误信息的键:required,invalid

接收一个可选参数:input_formats,如果没有提供input_formats默认的输入格式为:

['%Y-%m-%d %H:%M:%S',    # '2006-10-25 14:30:59'
'%Y-%m-%d %H:%M', # '2006-10-25 14:30'
'%Y-%m-%d', # '2006-10-25'
'%m/%d/%Y %H:%M:%S', # '10/25/2006 14:30:59'
'%m/%d/%Y %H:%M', # '10/25/2006 14:30'
'%m/%d/%Y', # '10/25/2006'
'%m/%d/%y %H:%M:%S', # '10/25/06 14:30:59'
'%m/%d/%y %H:%M', # '10/25/06 14:30'
'%m/%d/%y'] # '10/25/06'

18、DecimalField

默认的Widget:当Field.localize是False时为NumberInput,否则为TextInput

空值:None

规范化为:python decimal对象

验证给定的值为一个十进制数,忽略前导和尾随的空白

错误信息的键:max_whole_digits,max_digits,max_decimal_places,max_value,invalid,required,min_value

接收四个可选参数:

max_value,min_value:允许的值范围,需要赋值decimal.Decimal对象,不能直接给个整数类型

max_digits:值允许的最大位数(小数点之前和之后的数字总共的位数,前导的零将被删除)

decimal_places:允许的最大小数位

19、DurationField

默认的Widget:TextInput

空值:None

规范化为:python timedela

验证给出的值是一个字符串,而且可以转换为timedelta对象

错误信息的键:required,invalid

20、EmailField

默认的Widget:EmailInput
空值:''(一个空字符串)
规范化为:Unicode 对象。
使用正则表达式验证给出的值是一个合法的邮件地址。
错误信息的键:required, invalid
两个可选的参数用于验证,max_length 和min_length

21、FileField

默认的Widget:ClearableFileInput
空值:None
规范化为:一个UploadedFile对象,它封装文件内容和文件名到一个对象内。
验证非空的文件数据已经绑定到表单。
错误信息的键:missing, invalid, required, empty, max_length
具有两个可选的参数用于验证:max_length 和 allow_empty_file。

22、FilePathField

默认的Widget:Select
空值:None
规范化为:Unicode 对象。
验证选择的选项在选项列表中存在。
错误信息的键:required, invalid_choice
这个字段允许从一个特定的目录选择文件。 它有五个额外的参数,其中的path是必须的:

path:要列出的目录的绝对路径。 这个目录必须存在。

recursive:如果为False(默认值),只用直接位于path下的文件或目录作为选项。如果为True,将递归访问这个目录,其内所有的子目录和文件都将作为选项。

match:正则表达模式;只有具有与此表达式匹配的文件名称才被允许作为选项。

allow_files:可选。默认为True。表示是否应该包含指定位置的文件。它和allow_folders必须有一个为True。

allow_folders可选。默认为False。表示是否应该包含指定位置的目录。

23、FloatField

默认的Widget:当Field.localize是False时为NumberInput,否则为TextInput。
空值:None
规范化为:Float 对象。
验证给定的值是一个浮点数。
错误信息的键:max_value, invalid, required, min_value
接收两个可选的参数用于验证,max_value和min_value,控制允许的值的范围。

24、ImageField

默认的Widget:ClearableFileInput
空值:None
规范化为:一个UploadedFile 象,它封装文件内容和文件名为一个单独的对象。
验证文件数据已绑定到表单,并且该文件是Pillow可以解析的图像格式。
错误信息的键:missing, invalid, required, empty, invalid_image
使用ImageField需要安装Pillow(pip install pillow)。如果在上传图片时遇到图像损坏错误,通常意味着使用了Pillow不支持的格式。

25、IntegerField

默认的Widget:当Field.localize是False时为NumberInput,否则为TextInput。
空值:None
规范化为:Python 整数或长整数。
验证给定值是一个整数。 允许前导和尾随空格,类似Python的int()函数。
错误信息的键:max_value, invalid, required, min_value
两个可选参数:max_value和min_value,控制允许的值的范围。

26、GenericIPAddressField

包含IPv4或IPv6地址的字段。

默认的Widget:TextInput
空值:''(一个空字符串)
规范化为:一个Unicode对象。
验证给定值是有效的IP地址。
错误信息的键:required, invalid
有两个可选参数:protocol和unpack_ipv4

27、MultipleChoiceField

默认的Widget:SelectMultiple
空值:[](一个空列表)
规范化为:一个Unicode 对象列表。
验证给定值列表中的每个值都存在于选择列表中。
错误信息的键:invalid_list, invalid_choice, required

28、TypedMultipleChoiceField

类似MultipleChoiceField,除了需要两个额外的参数,coerce和empty_value。

默认的Widget:SelectMultiple
空值:empty_value
规范化为:coerce参数提供的类型值列表。
验证给定值存在于选项列表中并且可以强制。
错误信息的键:required, invalid_choice

29、NullBooleanField

默认的Widget:NullBooleanSelect
空值:None
规范化为:Python None, False 或True 值。
不验证任何内容(即,它从不引发ValidationError)。

30、RegexField

默认的Widget:TextInput
空值:''(一个空字符串)
规范化为:一个Unicode 对象。
验证给定值与某个正则表达式匹配。
错误信息的键:required, invalid
需要一个必需的参数:regex,需要匹配的正则表达式。

还可以接收max_length,min_length和strip参数,类似CharField。

31、SlugField

默认的Widget:TextInput
空值:''(一个空字符串)
规范化为:一个Unicode 对象。
验证给定的字符串只包括字母、数字、下划线及连字符。
错误信息的键:required, invalid
此字段用于在表单中表示模型的SlugField。

32、TimeField

默认的Widget:TextInput
空值:None
规范化为:一个Python 的datetime.time 对象。
验证给定值是datetime.time或以特定时间格式格式化的字符串。
错误信息的键:required, invalid
接收一个可选的参数:input_formats,用于尝试将字符串转换为有效的datetime.time对象的格式列表。

如果没有提供input_formats,默认的输入格式为:

'%H:%M:%S',     # '14:30:59'
'%H:%M', # '14:30'

33、URLField

默认的Widget:URLInput
空值:''(一个空字符串)
规范化为:一个Unicode 对象。
验证给定值是个有效的URL。
错误信息的键:required, invalid
可选参数:max_length和min_length

34、UUIDField

默认的Widget:TextInput
空值:''(一个空字符串)
规范化为:UUID对象。
错误信息的键:required, invalid

35、ComboField

默认的Widget:TextInput
空值:''(一个空字符串)
规范化为:Unicode 对象。
根据指定为ComboField的参数的每个字段验证给定值。
错误信息的键:required, invalid
接收一个额外的必选参数:fields,用于验证字段值的字段列表(按提供它们的顺序)。

>>> from django.forms import ComboField
>>> f = ComboField(fields=[CharField(max_length=20), EmailField()])
>>> f.clean('test@example.com')
'test@example.com'
>>> f.clean('longemailaddress@example.com')
Traceback (most recent call last):
...
ValidationError: ['Ensure this value has at most 20 characters (it has 28).']

36、MultiValueField

默认的Widget:TextInput
空值:''(一个空字符串)
规范化为:子类的compress方法返回的类型。
根据指定为MultiValueField的参数的每个字段验证给定值。
错误信息的键:incomplete, invalid, required

37、SplitDateTimeField

默认的Widget:SplitDateTimeWidget
空值:None
规范化为:Python datetime.datetime 对象。
验证给定的值是datetime.datetime或以特定日期时间格式格式化的字符串。
错误信息的键:invalid_date, invalid, required, invalid_time

38、ModelChoiceField

默认小部件: Select
空值: None
规范化为:模型实例。
验证查询集中是否存在给定的id。
错误消息键:required,invalid_choice
queryset必须参数指定一个QuerySet模型对象,并从中到处字段的选项
两个可选参数:
empty_label:可用更改标签文本或设置为None来禁用空标签
to_field_name:用于指定要用作字段窗口中选项的值的字段,以确保它是模型的唯一字段默认为None将使用每个对象的主键

39、ModelMultipleChoiceField

默认小部件:SelectMultiple
空值:空QuerySet(self.queryset.none())
规范化为:QuerySet模型实例
验证查询集中是否存在给定值列表中的每个id。
错误信息键:required,list,invalid_choice, invalid_pk_value
queryset:必须参数,与ModelChoiceField.queryset相同
一个可选参数:
to_field_name:与ModelChoiceField.to_field_name相同

40、创建自定义字段

如果内置Field类不能满足您的需求,我们可以轻松创建自定义Field类,为此只需创建一个dango.forms.Field子类,它的唯一要求是,必须实现一个clean()方法,而且其__init__()实现required,label,initial,widget,help_text方法

django表单字段的更多相关文章

  1. python 全栈开发,Day111(客户管理之 编辑权限(二),Django表单集合Formset,ORM之limit_choices_to,构造家族结构)

    昨日内容回顾 1. 权限系统的流程? 2. 权限的表有几个? 3. 技术点 中间件 session orm - 去重 - 去空 inclusion_tag filter 有序字典 settings配置 ...

  2. python3之Django表单(一)

    1.HTML中的表单 在HTML种,表单是在<form>...</form>种的元素,它允许用户输入文本,选择选项,操作对象等,然后发送这些数据到服务器 表单元素允许用户在表单 ...

  3. django表单的api

    django表单的api,参考文档:https://yiyibooks.cn/xx/Django_1.11.6/ref/forms/api.html 绑定与未绑定形式: Form要么是绑定的,要么是未 ...

  4. Django表单API详解

    声明:以下的Form.表单等术语都指的的广义的Django表单. Form要么是绑定了数据的,要么是未绑定数据的. 如果是绑定的,那么它能够验证数据,并渲染表单及其数据,然后生成HTML表单.如果未绑 ...

  5. Django 表单处理流程

    Django 的表单处理:视图获取请求,执行所需的任何操作,包括从模型中读取数据,然后生成并返回HTML页面(从模板中),我们传递一个包含要显示的数据的上下文.使事情变得更复杂的是,服务器还需要能够处 ...

  6. 第四章:Django表单 - 2:Django表单API详解

    声明:以下的Form.表单等术语都指的的广义的Django表单. Form要么是绑定了数据的,要么是未绑定数据的. 如果是绑定的,那么它能够验证数据,并渲染表单及其数据,然后生成HTML表单.如果未绑 ...

  7. 第四章:Django表单 - 1:使用表单

    假设你想从表单接收用户名数据,一般情况下,你需要在HTML中手动编写一个如下的表单元素: <form action="/your-name/" method="po ...

  8. 第四章:Django表单 - 3:Django表单字段汇总

    Field.clean(value)[source] 虽然表单字段的Field类主要使用在Form类中,但也可以直接实例化它们来使用,以便更好地了解它们是如何工作的.每个Field的实例都有一个cle ...

  9. 第四章:Django表单 - 5:模型表单ModelForm

    如果你正在构建一个数据库驱动的应用,那么你可能会有与Django的模型紧密映射的表单.比如,你有个BlogComment模型,并且你还想创建一个表单让大家提交评论到这个模型中.在这种情况下,写一个fo ...

随机推荐

  1. 61. Rotate List(M);19. Remove Nth Node From End of List(M)

    61. Rotate List(M) Given a list, rotate the list to the right by k places, where k is non-negative. ...

  2. Hadoop生态圈-Azkaban实现文件上传到hdfs并执行MR数据清洗

    Hadoop生态圈-Azkaban实现文件上传到hdfs并执行MR数据清洗 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 如果你没有Hadoop集群的话也没有关系,我这里给出当时我 ...

  3. 使用Python的turtle(海龟)模块画图

    第一步:让Python引入turtle模块,引入模块就是告诉Python你想要用它. import turtle 第二步:创建画布.调用turtle中的Pen函数 t = turtle.Pen() 第 ...

  4. SSIS系列文章收藏

    http://blog.csdn.net/kk185800961/article/details/12398667 https://wenku.baidu.com/view/d16105abdd338 ...

  5. 网络获取json数据并解析

    1.升级流程分析

  6. json字符串和Json对象,以及json的基本了解

    考虑到python等语言中没有更好表示json对象的方法,所以使用JavaScript来介绍json 首先是json字符串: var str1 = '{ "name": " ...

  7. MongoDB-3.4搭建副本集

    搭建副本集 1:首先创建3台虚拟机作为配置环境 IP1:192.168.101.175 IP2:192.168.101.176 IP3:192.168.101.177 2.下载MongoDB 3.4版 ...

  8. Python-Analysis-Malware

    Python恶意软件分析应用-PEfile 0x1.前言 要想对恶意代码快速分析,Python是一门必须要掌握的编程技能.因为它是跨平台的,而且容易阅读和编写.许多开源安全工具也是用Python写的. ...

  9. linux下常用FTP命令 上传下载文件【转】

    1. 连接ftp服务器 格式:ftp [hostname| ip-address]a)在linux命令行下输入: ftp 192.168.1.1 b)服务器询问你用户名和密码,分别输入用户名和相应密码 ...

  10. zabbix3.0配置服务器流量告警

    zabbix配置流量告警 zabbix虽然已经对服务器的网卡流量进行了监控,但为了防止某台机器流量过高导致网络慢,或者因为中病毒或木马等原因,导致流量很高,可使用zabbix的流量告警功能来对流量进行 ...