form组件特性html
- 数据验证功能
- 生成HTML代码
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类,其它数据类型会有一些独有的参数==前端
参数 | 释义 |
---|---|
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, | 是否能够编辑 |
参数 | 释义 |
---|---|
max_length=None | 最大长度 |
min_length=None | 最小长度 |
strip=True | 去除首尾空字符 |
empty_value='' | 空值 |
参数 | 释义 |
---|---|
max_value=None | 最大值 |
min_value=None | 最小值 |
参数 | 释义 |
---|---|
max_value=None | 最大值 |
min_value=None | 最小值 |
max_digits=None | 最大位数 |
decimal_places=None | 小数点后位数 |
参数 | 释义 |
---|---|
input_formats=None | 输入格式 |
参数 | 释义 |
---|---|
regex | 自定制正则表达式 |
参数 | 释义 |
---|---|
choices=() | 默认内容 |
参数 | 释义 |
---|---|
path | 路径 |
match=None | 匹配 |
recursive=False | 递归显示 |
allow_files=True | 全部文件 |
参数 | 释义 |
---|---|
input_date_formats=None | 输入日期格式化 |
input_time_formats=None | 输入时间格式化 |
from django import forms from django.forms import fields class 自定义form模块类名称(forms.Form): #继承forms模块 验证字段名(与数据库字段名保持一致)=验证类型(验证参数)
支持多个正则表达式git
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':'格式有问题', } )
说明:【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 | 验证错误的全部错误信息 |
生成表单标签数据库
生成HTML用法 | 释义 |
---|---|
{{ data_obj.as_标签 }} | 生成所有信息,标签能够是table、p、ul等,如{{ data_obj.as_p }} |
{{ data_obj.字段 }} | 生成指定的字段信息,如{{ data_obj.name }} |
表单对应属性django
表单属性 | 释义 |
---|---|
{{ 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更改默认样式示例1【变动默认样式】函数
from django.forms import fields,widgets gen = fields.ChoiceField( label="性别", choices=((0,'男'),(1,'女'),), initial=0, widget=widgets.RadioSelect, error_messages={ 'required': '性别是必选项' }
widget更改默认样式示例2【更改默认属性】ui
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