Django基础-Form组件模块

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

转载于:https://my.oschina.net/zhaojunhui/blog/2906890

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值