Django表单层字段解释

前言

这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题

于是乎,我自己开发了一款面试宝典,希望能帮到大家,也希望有更多的Python新人真正加入从事到这个行业里,让python火不只是停留在广告上。

微信小程序搜索:Python面试宝典

或可关注原创个人博客:https://lienze.tech

也可关注微信公众号,不定时发送各类有趣猎奇的技术文章:Python编程学习

表单层

django提供了一整套健全的机制来帮助我们自动创建对应HTML中的表单

开发者可以方便的使用已经设定好的一系列字段进行表单的设计

可以在某个app下面新建一个forms.py文件,在这个文件进行django自带表单类的编写

比如像下面这样

from django import forms
class TestForm(forms.Form):
	name = forms.CharField(label='名字:',max_length=100)

在这个表单类中,设置了一个CharField字段,并且具有label标签值为name

此外在<input>标签处还会设置maxlength=100的属性、django在接收到这样表单内的数据时,还将验证数据的长度

实例化该类,然后打印出来查看效果

<tr><th><label for="id_name">名字:</label></th><td><input type="text" name="name" maxlength="100" required id="id_name" /></td></tr>

在渲染后的结果中不包含提交的按钮,以及外层的form标签,还需要我们自己手动在模板页面中进行添加

form表单实例的使用也非常简单,直接在模板页面处将表单实例以模板变量形式传递赋值即可

# views.py
def index(request):
    form = forms.TestForm()
    return render(request,'index.html',locals()) 	
<!-- index.html -->
<form action="/" method="POST">
	{% csrf_token %}
	{{ form }}
	<input type="submit" value="提交">
</form>

is_valid校验

每一个form类的实例都具有一个is_valid()方法,验证表单内的字段是否合法,并将表单中合法的的数据将放到表单中的cleaned_data属性中

如果全部数据都没有问题,那么该函数将会返回True,返回的合法数据。结果是一个字典的数据类型

form = TestFrom()
if form.is_valid():
	data = form.cleaned_data
def post_test(request):
	if request.method == "POST":
		form = TestForm(request.POST)
		if form.is_valid():
            name = form.cleaned_data.get('name')
			return HttpResponse('OK')
	else:
		form = TestForm()
	return render(request, "xxx.html",{"form":form})

在视图函数中,当用户以post形式提交数据,此时将post数据与表单类进行关联

使用post数据做为类实例化的参数,这种操作也叫作绑定数据到表单

如果用户在表单中填写张三并提交,那么绑定数据之后的表单实例像是这样

<label for="id_name">名字:</label>
<input id="id_name" maxlength="100" name="name" type="text" value="张三" />

input标签中的value值为用户post所提交的数据

如果绑定数据的表单实例经过is_valid函数校验并通过,那么正确的数据将存储在cleaned_data中,cleaned_data中的数据同时也是处理好的Python数据类型,比如这里为一个字典数据类型

接下来在视图函数中可以直接通过字典的操作方式来获取到用户在对应表单标签中所填写的数据

表单字段类型

  • 注意:所有表单字段Field的子类均带有默认参数require
BooleanField
  • 控件:CheckboxInput

  • 复选框:<input type='checkbox' ...>

  • 空值:False

  • PythonTrue\False

  • 错误键required

CharField
  • 控件:TextInput

  • 文本输入:<input type="text" ...>

  • 空值:空字符串

  • Pythonstr

  • 错误键max_lengthmin_lengthrequired

ChoiceField
  • 控件:Select

  • 选择框:<select><option ...>...</select>

  • 空值:空字符串

  • Python:Unicode str

  • 必选参数:choices,该参数为一个二元组组成的可迭代对象,二元组中的第一个值为获取到的数据,第二个值为表单中展示的内容。

  • 错误键requiredinvalid_choice

class TestForm(forms.Form):
    choices = (
        ('0','男'),
        ('1','女'),
    )
    gender = forms.ChoiceField(choices=choices)
DateField
  • 控件:DateInput

  • 日期以普通的文本框输入:<input type='text' ...>

  • 空值:None

  • Python:datetime.date

  • 验证是否为一个指定日期格式的字符串

  • 错误键requiredinvalid

  • 可选参数:input_formats,一个时间格式化字符串,用来将表单中的数据转换为datetime.date对象

可选参数格式参考如下:

'%Y-%m-%d',	# '2006-10-25'
'%m/%d/%Y', # '10/25/2006'
'%m/%d/%y' 	# '10/25/06'
DateTimeField
  • 控件:DateTimeInput

  • 日期/时间以普通的文本框输入:<input type=‘text’ …>

  • 空值:None

  • Python:datetime.datetime

  • 验证是否为一个指定日期格式的字符串

  • 可选参数:input_formats,一个时间格式化字符串,用来将表单中的数据转换为datetime.datetime对象

  • 错误键requiredinvalid

DecimalField
  • 控件:当Field.localizeFalse 时为NumberInput,否则为TextInput

  • NumberInput文本输入:<input type="number" ...>

  • TextInput文本输入:<input type="text" ...>

  • 空值:None

  • Python:decimal

  • 验证给定值是否为一个十进制数字

  • 可选参数:max_valuemin_value控制大小值范围

max_digits: 值允许的最大位数(小数点之前和之后的数字总共的位数,前导的零将被删除)
decimal_places: 允许的最大小数位
  • 错误键requiredinvalidmax_valuemin_valuemax_digitsmax_decimal_places max_whole_digits
EmailField
  • 控件:文本输入:<input type="email" ...>

  • 空值:空字符串

  • Python:Unicode str

  • 使用正则验证给定的值是否为一个合法的邮件地址

  • 可选参数:max_lengthmin_length,限定邮件地址字符串大小长度。

  • 错误键requiredinvalid

FileField
  • 控件:ClearableFileInput

  • 文件上传输入:<input type='file' ...>

  • 空值:None

  • Python:UploadedFile

  • 验证非空的文件数据绑定到表单

  • 使用该字段时,在使用表单实例获取上传文件数据时,表单标签中需要具备enctype="multipart/form-data"属性,此外还需要绑定文件数据在表单上

form = TestForm(request.POST,request.FILES)
FloatField
  • 控件:当Field.localizeFalse 时为NumberInput,否则为TextInput
NumberInput文本输入: <input type="number" ...>
TextInput文本输入: <input type="text" ...>
  • 空值:None

  • Python:Float

  • 验证给出的值是一个浮点数,对比float函数

  • 可选参数:max_valuemin_value限定大小值范围

  • 错误键requiredinvalidmax_valuemin_value

ImageField
  • 控件:ClearableFileInput

  • 文件上传输入:<input type='file' ...>

  • 空值:None

  • Python:UploadedFile

  • 验证文件数据并且检验是否是一个可以被pillow所解释的图像

  • 使用该字段,需要安装pillow模块。

  • 错误键requiredinvalidmissingemptyinvalid_image

IntergerField
  • 控件:当Field.localizeFalse时为NumberInput,否则为TextInput
NumberInput文本输入: <input type="number" ...>
TextInput文本输入: <input type="text" ...>
  • 空值:None

  • Python:int

  • 验证给定的值是否是一个整数

  • 可选参数:max_valuemin_value限定大小值范围

  • 错误键requiredinvalidmax_valuemin_value

GenericIPAddressField
  • 控件:TextInput

  • 文本输入:<input type="text" ...>

  • 空值:空字符串

  • Python:Unicode str

  • 可选参数:protocol默认值为both,可选IPv4或IPv6。

  • 错误键requiredinvalid

MultipleChoiceField
  • 控件:SelectMultiple
<select multiple='multiple'>...</select>
  • 空值:一个空列表

  • Python:list

  • 验证表单中的值是否存在于选择列表中,对比ChoiceField,该字段支持多选

  • 必选参数:choices,与ChoiceField类似,接收一个二元组可迭代对象

  • 错误键requiredinvalid_choiceinvalid_list

RegexField
  • 控件:TextInput

  • 文本输入:<input type="text" ...>

  • 空值:空字符串

  • Python:Unicode str

  • 验证表单中值与某个正则表达式匹配

  • 必选参数:regex,字符串或编译的正则表达式

  • 可选参数:max_lengthmin_length

  • 错误键requiredinvalid

SlugField
  • 控件:TextInput

  • 文本输入:<input type="text" ...>

  • 空值:空字符串

  • Python:Unicode对象

  • 验证给定的值为字母数字下划线连字符组成

  • 错误键requiredinvalid

URLField
  • 控件:TextInput

  • 文本输入:<input type="text" ...>

  • 空值:空字符串

  • Python:Unicode对象

  • 验证给定值是一个有效的URL

  • 可选参数:max_lengthmin_length

  • 错误键requiredinvalid

TimeField
  • 控件:TextInput

  • 文本输入:<input type="text" ...>

  • 空值:None

  • Python:datetime.time

  • 验证给定值是否为一个给定格式的时间字符串

  • 可选参数:input_formats,控制表单输入的格式

表单属性

  • required

表单字段为必填值,当传递数据为一个空值,不管是空字符串还是None

在表单验证时,将引发ValidationError异常,这个异常将会在表单上展示错误信息

  • label

指定当前字段的label标签值,字段默认Label为字段名所有下换线转换为空格

且一个字母大写生成

  • label_suffix

修改label提示字符串的追加符号,默认表单类实例化过程会自动在label属性后加:

  • initial

字段的初始值。不能将初始值直接作为参数传入,会造成直接验证表单数据而报错。

form = forms.TestForm(initial={'name':'Bob'})
  • widget

表单字段渲染时使用的Widget类,如果不想使用默认的表单类型,通过该参数指明所需表单控件

可以使用类似的表单类型,在下面会有详细的介绍。

  • help_text

指定字段的描述文本,该文本一般会紧挨着字段显示

required=True,               是否允许为空
widget=None,                 HTML插件(from django.forms import widgets) 设置属性
abel=None,                  用于生成Label标签或显示内容(前端obj.label--> 用户名:【】(输入框))
initial=None,                初始值
help_text='',                帮助信息(在标签旁边显示)
error_messages=None,         错误信息 {'required': '不能为空', 'invalid': '格式错误'}
show_hidden_initial=False,   是否在当前插件后面再加一个隐藏的且具有默认值的插件(可用于检验两次输入是否一直)
validators=[],               自定义验证规则(正则表达式)
localize=False,              是否支持本地化(比如时间数据,当地时间,UTC时间(比如东八区,自动加8小时))
disabled=False,              是否可以编辑
label_suffix=None            Label内容后缀

表单控件:widget

默认django会为每一个表单字段设置默认的HTML控件,控件用来渲染HTML中输入元素与提取提交的原始数据

如果你希望使用一个不同的控件Widget,可以为字段设置widget参数

from django import forms
class CommentForm(forms.Form):
	comment = forms.CharField(widget=forms.Textarea)
#修改CharField默认控件TextInput为Textarea

此外,我们还可以为字段的Widget设置额外的属性,比如一些之后在HTML渲染时候将会使用到的标签class值等等;只需要在widget参数部分使用attrs形参指定即可,该参数设置这个字段控件的对应HTML属性

name = forms.CharField(
    max_length=5,
    widget=forms.TextInput(attrs={'class':'green'})
)

还可以使用日期控件覆盖默认日期控件

YEARS = ('2016', '2017', '2018')
MONTHS = {
	1:'一月', 2:'二月', 3:'三月', 4:'四月',
5:'五月', 6:'六月', 7:'七月', 8:'八月',
9:'九月', 10:'十月', 11:'十一月', 12:'十二月'
}
birth_year = forms.DateField(widget=froms.SelectDateWidget(years=YEARS,months=MONTHS))

文本输入控件
  • TextInput

文本输入:<input type="text" ...>

  • NumberInput

文本输入:<input type="number" ...>

  • EmailInput

文本输入:<input type="email" ...>

  • URLInput

文本输入:<input type="url" ...>

  • PasswordInput

密码输入:<input type='password' ...>

  • HiddenInput

隐藏输入:<input type='hidden' ...>

  • DateInput

日期以普通的文本框输入:<input type='text' ...>

可选参数:format,时间的字符串格式

  • DateTimeInput

日期/时间以普通的文本框输入:<input type='text' ...>

可选参数:format,时间的字符串格式

  • TimeInput

时间以普通的文本框输入:<input type='text' ...>

可选参数:format,时间的字符串格式

  • Textarea

文本区域:<textarea>...</textarea>

选择和复选框
  • CheckboxInput

复选框:<input type='checkbox' ...>

可选参数:check_test

这个参数接收一个函数对象,函数对象的参数为当前CheckboxInput的值,函数对象如果返回True,该控件在字段渲染时自动勾上。

comment = forms.CharField(widget=forms.CheckboxInput(check_test=lambda *arg: True))
  • Select

单选框:<select><option ...>...</select>

可选参数:choices,与字段设置相同,但是会被字段设置所覆盖。

  • NullBooleanSelect

单选框:选项为UnknownYesNoUnknown也代表False

  • SelectMultiple

多选框:<select multiple='multiple'>...</select>

  • RadioSelect

单选框,与select类似,但是会将选择渲染为一个单选按钮列表

  • CheckboxSelectMultiple

多选框:与SelectMultiple类似,但是会渲染为一个复选框列表

复合控件

SelectDateWidget

封装了三个Widget,分别用于年、月、日

  • 可选参数:可以来指定日期表单的选择
years # 一个列表或元组的序列数据类型,用来确定年的选择。
months # 一个字典数据类型,字典的key值为月份数字,从1开始,value值为在表单中渲染展示的字符串,比如
MONTHS = {
	1:'一月', 2:'二月', 3:'三月', 4:'四月',
	5:'五月', 6:'六月', 7:'七月', 8:'八月',
	9:'九月', 10:'十月', 11:'十一月', 12:'十二月'
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李恩泽的技术博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值