Django基础-Form组件模块

Forms组件模块

form组件特性html

  • 数据验证功能
  • 生成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模块
    验证字段名(与数据库字段名保持一致)=验证类型(验证参数)

支持多个正则表达式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':'格式有问题',
        }
    )

获取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 }}

表单对应属性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示例

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
相关文章
相关标签/搜索