前言
这几年一直在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
-
Python
:True\False
-
错误键:
required
CharField
-
控件:
TextInput
-
文本输入:
<input type="text" ...>
-
空值:空字符串
-
Python
:str
-
错误键:
max_length
、min_length
、required
ChoiceField
-
控件:
Select
-
选择框:
<select><option ...>...</select>
-
空值:空字符串
-
Python:
Unicode str
-
必选参数:
choices
,该参数为一个二元组组成的可迭代对象,二元组中的第一个值为获取到的数据,第二个值为表单中展示的内容。 -
错误键:
required
、invalid_choice
class TestForm(forms.Form):
choices = (
('0','男'),
('1','女'),
)
gender = forms.ChoiceField(choices=choices)
DateField
-
控件:
DateInput
-
日期以普通的文本框输入:
<input type='text' ...>
-
空值:
None
-
Python:
datetime.date
-
验证是否为一个指定日期格式的字符串
-
错误键:
required
、invalid
-
可选参数:
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
对象 -
错误键:
required
、invalid
DecimalField
-
控件:当
Field.localize
是False
时为NumberInput
,否则为TextInput
-
NumberInput
文本输入:<input type="number" ...>
-
TextInput
文本输入:<input type="text" ...>
-
空值:
None
-
Python:
decimal
-
验证给定值是否为一个十进制数字
-
可选参数:
max_value
、min_value
控制大小值范围
max_digits: 值允许的最大位数(小数点之前和之后的数字总共的位数,前导的零将被删除)
decimal_places: 允许的最大小数位
- 错误键:
required
,invalid
,max_value
,min_value
,max_digits
,max_decimal_places
max_whole_digits
EmailField
-
控件:文本输入:
<input type="email" ...>
-
空值:空字符串
-
Python:
Unicode str
-
使用正则验证给定的值是否为一个合法的邮件地址
-
可选参数:
max_length
与min_length
,限定邮件地址字符串大小长度。 -
错误键:
required
、invalid
FileField
-
控件:
ClearableFileInput
-
文件上传输入:
<input type='file' ...>
-
空值:
None
-
Python:
UploadedFile
-
验证非空的文件数据绑定到表单
-
使用该字段时,在使用表单实例获取上传文件数据时,表单标签中需要具备
enctype="multipart/form-data"
属性,此外还需要绑定文件数据在表单上
form = TestForm(request.POST,request.FILES)
FloatField
- 控件:当
Field.localize
是False
时为NumberInput
,否则为TextInput
NumberInput文本输入: <input type="number" ...>
TextInput文本输入: <input type="text" ...>
-
空值:
None
-
Python:
Float
-
验证给出的值是一个浮点数,对比
float
函数 -
可选参数:
max_value
、min_value
限定大小值范围 -
错误键:
required
,invalid
,max_value
,min_value
ImageField
-
控件:
ClearableFileInput
-
文件上传输入:
<input type='file' ...>
-
空值:
None
-
Python:
UploadedFile
-
验证文件数据并且检验是否是一个可以被pillow所解释的图像
-
使用该字段,需要安装
pillow
模块。 -
错误键:
required
,invalid
,missing
,empty
,invalid_image
IntergerField
- 控件:当
Field.localize
是False
时为NumberInput
,否则为TextInput
NumberInput文本输入: <input type="number" ...>
TextInput文本输入: <input type="text" ...>
-
空值:
None
-
Python:
int
-
验证给定的值是否是一个整数
-
可选参数:
max_value
、min_value
限定大小值范围 -
错误键:
required
,invalid
,max_value
,min_value
GenericIPAddressField
-
控件:
TextInput
-
文本输入:
<input type="text" ...>
-
空值:空字符串
-
Python:
Unicode str
-
可选参数:protocol默认值为both,可选IPv4或IPv6。
-
错误键:
required
,invalid
MultipleChoiceField
- 控件:
SelectMultiple
<select multiple='multiple'>...</select>
-
空值:一个空列表
-
Python:
list
-
验证表单中的值是否存在于选择列表中,对比
ChoiceField
,该字段支持多选 -
必选参数:
choices
,与ChoiceField
类似,接收一个二元组可迭代对象 -
错误键:
required
,invalid_choice
,invalid_list
RegexField
-
控件:
TextInput
-
文本输入:
<input type="text" ...>
-
空值:空字符串
-
Python:
Unicode str
-
验证表单中值与某个正则表达式匹配
-
必选参数:
regex
,字符串或编译的正则表达式 -
可选参数:
max_length
、min_length
-
错误键:
required
,invalid
SlugField
-
控件:
TextInput
-
文本输入:
<input type="text" ...>
-
空值:空字符串
-
Python:
Unicode
对象 -
验证给定的值为字母、数字、下划线及连字符组成
-
错误键:
required
,invalid
URLField
-
控件:
TextInput
-
文本输入:
<input type="text" ...>
-
空值:空字符串
-
Python:
Unicode
对象 -
验证给定值是一个有效的
URL
-
可选参数:
max_length
、min_length
-
错误键:
required
,invalid
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
单选框:选项为Unknown
、Yes
和No
,Unknown
也代表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:'十二月'
}