Forms组件模块
form组件特性
- 数据验证功能
- 生成HTML代码
引用form组件模块
from django import forms #引入forms模块
from django.forms import fields
所有模块类综合表
模块类名称 | 用途释义 | 模块类名称 | 用途释义 |
---|---|---|---|
Field | 字段主类 | CharField(Field) | 字符串 |
IntegerField(Field) | 整型 | FloatField(IntegerField) | 浮点数 |
DecimalField(IntegerField) | 小数 | BaseTemporalField(Field) | 时间格式化 |
DateField(BaseTemporalField) | 日期 | TimeField(BaseTemporalField) | 时间 |
DateTimeField(BaseTemporalField) | 带时间的日期 | DurationField(Field) | 持续时间 |
RegexField(CharField) | 正则表达式 | EmailField(CharField) | 邮箱 |
FileField(Field) | 文件 | ImageField(FileField) | 图片 |
URLField(CharField) | URL地址 | BooleanField(Field) | 布尔值 |
NullBooleanField(BooleanField) | 可以为空的布尔值 | ChoiceField(Field) | 选择框 |
TypedChoiceField(ChoiceField) | 带数据转换选择框 | MultipleChoiceField(ChoiceField) | 多选框 |
TypedMultipleChoiceField(MultipleChoiceField) | 带数据转换多选框 | ComboField(Field) | 多类型组合 |
MultiValueField(Field) | 多个值 | FilePathField(ChoiceField) | 文件路径 |
SplitDateTimeField(MultiValueField) | 分割日期时间 | GenericIPAddressField(CharField) | IP地址 |
SlugField(CharField) | 为model记录生成URL唯一路径 | UUIDField(CharField) | 数据库UUID类型验证 |
数据类型参数表
Field
==其它数据类型都是直接或间接继承Field类,其它数据类型会有一些独有的参数==
参数 | 释义 |
---|---|
required=True, | 是否为空限制 |
widget=None, | HTML插件[自定义生成文本域,单选多选框等,更改默认数据验证,添加自定义属性,比如样式等] |
label=None, | 生成label标签 |
label_suffix=None, | label内容后缀 |
initial=None, | 初始值 |
help_text="", | 帮助信息,在标签旁边显示 |
error_messages=None, | 错误信息 |
show_hidden_initial=Flase, | 是否在当前插件后加一个隐藏且具有默认值的插件,一般用于验证两次输入是否一致 |
validators=[], | 自定义验证规则 |
localize=False, | 是否支持本地化 |
disabled=False, | 是否可以编辑 |
CharField(Field)
参数 | 释义 |
---|---|
max_length=None | 最大长度 |
min_length=None | 最小长度 |
strip=True | 去除首尾空字符 |
empty_value='' | 空值 |
IntegerField(Field)
参数 | 释义 |
---|---|
max_value=None | 最大值 |
min_value=None | 最小值 |
DecimalField(IntegerField)
参数 | 释义 |
---|---|
max_value=None | 最大值 |
min_value=None | 最小值 |
max_digits=None | 最大位数 |
decimal_places=None | 小数点后位数 |
BaseTemporalField(Field)
参数 | 释义 |
---|---|
input_formats=None | 输入格式 |
RegexField(CharField)
参数 | 释义 |
---|---|
regex | 自定制正则表达式 |
ChoiceField(Field)
参数 | 释义 |
---|---|
choices=() | 默认内容 |
FilePathField(ChoiceField)
参数 | 释义 |
---|---|
path | 路径 |
match=None | 匹配 |
recursive=False | 递归显示 |
allow_files=True | 所有文件 |
SplitDateTimeField(MultiValueField)
参数 | 释义 |
---|---|
input_date_formats=None | 输入日期格式化 |
input_time_formats=None | 输入时间格式化 |
form模块验证示例
创建自定义验证模块类
from django import forms
from django.forms import fields
class 自定义form模块类名称(forms.Form): #继承forms模块
验证字段名(与数据库字段名保持一致)=验证类型(验证参数)
支持多个正则表达式
class From_check(forms.Form): #继承forms模块
user = fields.CharField(
label="用户",
max_length=18,
min_length=2,
required=True,
validators=[RegexValidator(r'^[0-9]{15}'),'15位数的身份证',RegexValidator(r'^[0-9]{17}([0-9]|X)$','18位数的身份证')],
error_messages={
'required':'用户名不能为空',
'max_length':'用户名不能超过18个字符',
'min_length':'用户名不能小于2个字符',
'invalid':'格式有问题',
}
)
获取form验证模块的数据
说明:【data_obj 】为自定义变量,【From_check】为自定义验证模块类
语句 | 释义 |
---|---|
data_obj = From_check() | 获取验证模块所有信息(包含错误信息反馈) |
data_obj = From_check({"user":data.user}) | 获取验证模块user字段的信息(data为数据库对象,user为数据库字段) |
data_obj = From_check(request.GET) | 获取 GET 方式提交所有验证数据 |
data_obj = From_check(request.POST) | 获取 POST 方式提交所有验证数据 |
if data_obj.is_valid(): | 判断是否验证通过 |
data_obj.cleaned_data | 验证通过的所有数据 |
data_obj.errors | 验证错误的所有错误信息 |
form模块生成
HTML表单生成
生成表单标签
生成HTML用法 | 释义 |
---|---|
{{ data_obj.as_标签 }} | 生成全部信息,标签可以是table、p、ul等,如{{ data_obj.as_p }} |
{{ data_obj.字段 }} | 生成指定的字段信息,如{{ data_obj.name }} |
表单对应属性
表单属性 | 释义 |
---|---|
{{ field.label }} | 字段对应的 lable 标签文字 |
{{ field.label_tag }} | 字段对应的 lable 标签 |
{{ field.id_for_label }} | 字段 id 属性 |
{{ field.value }} | 字段值 |
{{ field.html_name }} | 字段 name 属性的值 |
{{ field.help_text }} | 字段的帮助文本 |
{{ field.errors }} | 字段验证后的错误信息 |
{{ field.is_hidden }} | 判断字段是否隐藏字段结果为布尔值 |
{{ field.field }} | 字段对象,可以通过它访问字段的属性,例如“{{ field.field.max_length }}”,“{{ field.field.required}} |
综合生成HTML用法示例
#HTML页面生成
{{ obj.user }} | 从后端数据调取,利用 forms 模块生成 user用户 input标签 其它标签类同
{{ data_obj }} | 后端获取的所有数据
{{ data_obj.user }} | 后端获取的 user 字段的数据
{{ data_obj.user.cleaned_data }} | 后端获取的 user 字段验证通过的数据
{{ data_obj.user.cleaned_errors }} | 后端获取的 user 字段验证失败的错误信息反馈,可能有多个错误信息
{{ data_obj.user.cleaned_errors.0 }}| 后端获取的 user 字段验证失败的错误信息反馈的第一个错误信息
widget示例
widget更改默认样式示例1【变更默认样式】
from django.forms import fields,widgets
gen = fields.ChoiceField(
label="性别",
choices=((0,'男'),(1,'女'),),
initial=0,
widget=widgets.RadioSelect,
error_messages={
'required': '性别是必选项'
}
widget更改默认样式示例2【更改默认属性】
from django.forms import fields,widgets
xdb = fields.MultipleChoiceField(
label="城市",
choices=((0,'上海'),(1,'北京'),),
initial=0,
widget=widgets.SelectMultiple(attrs={'class':'style01'})
error_messages={
'required': '格式错误!'
}
根据源码自定义模块扩展验证
根据Forms模块源码得知验证方式,利用Django源码预留的clean_验证增加自定义扩展验证
from django.core.exceptions import ValidationError
def clean_验证字段(self):
验证代码【可从数据库调取数据做对比验证】
raise ValidationError('返回的错误信息')
return self.cleaned_data['验证字段']
用户名是否重复验证【单字段验证】
from django import forms
from django.forms import fields
from django.core.exceptions import ValidationError #引用错误反馈模块
class From_check(forms.Form): #继承forms模块
def clean_username(self): #自定义扩展验证函数
v = self.cleaned_data['username'] #需要验证的数据
if models.User_Tab.objects.filter(username=v).count(): #从User_Tab中查找对比数据出现次数可知数据库中是否有此用户名
raise ValidationError('此用户名已经被占用!')
return v
用户名和邮箱是否重复验证【多字段验证】
==注意,使用 clean() 函数做数据验证,拿到的是整体错误信息反馈,前端页面应该使用{{ obj.non_field_errors }} 来调用==
from django import forms
from django.forms import fields
from django.core.exceptions import ValidationError #引用错误反馈模块
class From_check(forms.Form): #继承forms模块
def clean(self): #Django预留扩展验证函数
value_dict = self.cleaned_data #其他验证通过的数据
v1 = value_dict.get('username') #拿到验证通过的 username 字段数据,用于再次验证
v2 = value_dict.get('email') #拿到验证通过的 email 字段数据,用于再次验证
if models.User_Tab.objects.filter(username=v1).count():#从User_Tab中查找对比数据出现次数可知数据库中是否有此用户名
raise ValidationError('此用户名已经被占用!')
elif models.User_Tab.objects.filter(email=v2).count():#从User_Tab中查找对比数据出现次数可知数据库中是否有此邮箱
raise ValidationError('此邮箱已经被占用!')
return self.cleaned_data
或
from django import forms
from django.forms import fields
from django.core.exceptions import ValidationError #引用错误反馈模块
class From_check(forms.Form): #继承forms模块
def clean(self): # Django预留扩展验证函数
value_dict = self.cleaned_data # 其他验证通过的数据
v1 = value_dict.get('user') # 拿到验证通过的 username 字段数据,用于再次验证
v2 = value_dict.get('email') # 拿到验证通过的 email 字段数据,用于再次验证
print("验证通过的用户名是:", v1, "邮箱是", v2)
d1 = models.User_tab.objects.filter(user=v1).count() # 获取数据库中用户名出现次数
d2 = models.User_tab.objects.filter(email=v2).count() # 获取数据库中邮箱出现次数
print("数据库获取v1是否存在", d1, "数据库获取v2是否存在", d2)
if d1 != 0 or d2 != 0: # 判断用户名和邮箱在数据库中是否存在
raise ValidationError('此用户或邮箱已经被占用!')
return self.cleaned_data