一、DjangoForm组件介绍
我们之前在html页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来。
与此同时我们在好多场景下都需要对用户的输入做校验,比如验证用户是否输入,输入的长度和格式等是否正确,如果用户输入的内容有错误就需要在页面上相应的位置显示对应的错误信息。
Django Form组件就实现了上面所述的功能。
1、生成页面可用的html标签(生成input框)
2、对用户提交的数据进行校验
3、错误信息的展示
4、保留上次的输入
缺点:只能生成form表单里面的内容,form标签需要自己建立,提交的按钮需要自己写,csrf_token也需要自己添加
二、form组件的字段和插件
创建form类时,主要涉及到【字段】和【插件】,字段用于对用户请求数据的验证,插件用于自动生成html
字段创建,默认为input框中的类型为text,可以通过插件来修改成按钮,多选框等等。
想通过插件修改,需要导入插件模块:from django.forms import widgets
1、字段
CharField(参数) 所有的字段都继承Field类,初始化都是TextFied,改变type都可以通过widgets改变
注:所有的字段类型都可以用CharField,然后通过widgets来修改
ChoiceField() 选择类的字段
通过widgets可改变为:widget = forms.widgets.radioSelect()
radioSelect(单选按钮)
Select(单选下拉)
SelectMultiple(多选下拉)
checkbox(单选方形按钮)
checkboxSelectMultiple(多选方形按钮)
示例:如何使用choiseField字段,及使用数据库中的数据
class LoginForm(forms.Form): ... hobby = forms.fields.ChoiceField( # choices=((1, "篮球"), (2, "足球"), (3, "双色球"),), choices= models.Hobby.object.all().values_list("id", "name") label="爱好", initial=[1, 3], widget=forms.widgets.CheckboxSelectMultiple() ) # 上面choices就用到了从数据库中获取数据,但这种方式,每次更改数据库,都需要重启项目,前端才能更新信息
关于choice的注意事项:
在使用选择标签字段时,需要注意choices的选项可以从数据库中获取,但时由于时静态字段,获取的值无法实时更新,即
中途向数据库中添加数据,前端不会实时更新,需要重启项目的问题,但重启项目明显不好,故可通过构造函数,每次查询时,都先去数据库中查一下使用的数据库中的字段。将如下的方法也放到类中即可。
方案一
def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields['hobby3'].choices = models.Hobby.objects.all().values_list('id', 'name')
注:其中fields代表的是自定义form类中所有的字段
注:当定义了__init__方法,那么类中对应字段的choices就可以删掉了
方案二
from django import forms from django.forms import fields from django.forms import models as form_model class FInfo(forms.Form): authors = form_model.ModelMultipleChoiceField(queryset=models.NNewType.objects.all()) # 多选 # authors = form_model.ModelChoiceField(queryset=models.NNewType.objects.all()) # 单选
DjangoForm所有的内置字段
Field required=True, 是否允许为空 widget=None, HTML插件 label=None, 用于生成Label标签或显示内容 initial=None, 初始值 help_text='', 帮助信息(在标签旁边显示) error_messages=None, 错误信息 {'required': '不能为空', 'invalid': '格式错误'} validators=[], 自定义验证规则 localize=False, 是否支持本地化 disabled=False, 是否可以编辑 label_suffix=None Label内容后缀 CharField(Field) max_length=None, 最大长度 min_length=None, 最小长度 strip=True 是否移除用户输入空白 IntegerField(Field) max_value=None, 最大值 min_value=None, 最小值 FloatField(IntegerField) ... DecimalField(IntegerField) max_value=None, 最大值 min_value=None, 最小值 max_digits=None, 总长度 decimal_places=None, 小数位长度 BaseTemporalField(Field) input_formats=None 时间格式化 DateField(BaseTemporalField) 格式:2015-09-01 TimeField(BaseTemporalField) 格式:11:12 DateTimeField(BaseTemporalField)格式:2015-09-01 11:12 DurationField(Field) 时间间隔:%d %H:%M:%S.%f ... RegexField(CharField) regex, 自定制正则表达式 max_length=None, 最大长度 min_length=None, 最小长度 error_message=None, 忽略,错误信息使用 error_messages={'invalid': '...'} EmailField(CharField) ... FileField(Field) allow_empty_file=False 是否允许空文件 ImageField(FileField) ... 注:需要PIL模块,pip3 install Pillow 以上两个字典使用时,需要注意两点: - form表单中 enctype="multipart/form-data" - view函数中 obj = MyForm(request.POST, request.FILES) URLField(Field) ... BooleanField(Field) ... NullBooleanField(BooleanField) ... ChoiceField(Field) ... choices=(), 选项,如:choices = ((0,'上海'),(1,'北京'),) required=True, 是否必填 widget=None, 插件,默认select插件 label=None, Label内容 initial=None, 初始值 help_text='', 帮助提示 ModelChoiceField(ChoiceField) ... django.forms.models.ModelChoiceField queryset, # 查询数据库中的数据 empty_label="---------", # 默认空显示内容 to_field_name=None, # HTML中value的值对应的字段 limit_choices_to=None # ModelForm中对queryset二次筛选 ModelMultipleChoiceField(ModelChoiceField) ... django.forms.models.ModelMultipleChoiceField TypedChoiceField(ChoiceField) coerce = lambda val: val 对选中的值进行一次转换 empty_value= '' 空值的默认值 MultipleChoiceField(ChoiceField) ... TypedMultipleChoiceField(MultipleChoiceField) coerce = lambda val: val 对选中的每一个值进行一次转换 empty_value= '' 空值的默认值 ComboField(Field) fields=() 使用多个验证,如下:即验证最大长度20,又验证邮箱格式 fields.ComboField(fields=[fields.CharField(max_length=20), fields.EmailField(),]) MultiValueField(Field) PS: 抽象类,子类中可以实现聚合多个字典去匹配一个值,要配合MultiWidget使用 SplitDateTimeField(MultiValueField) input_date_formats=None, 格式列表:['%Y--%m--%d', '%m%d/%Y', '%m/%d/%y'] input_time_formats=None 格式列表:['%H:%M:%S', '%H:%M:%S.%f', '%H:%M'] FilePathField(ChoiceField) 文件选项,目录下文件显示在页面中 path, 文件夹路径 match=None, 正则匹配 recursive=False, 递归下面的文件夹 allow_files=True, 允许文件 allow_folders=False, 允许文件夹 required=True, widget=None, label=None, initial=None, help_text='' GenericIPAddressField protocol='both', both,ipv4,ipv6支持的IP格式 unpack_ipv4=False 解析ipv4地址,如果是::ffff:192.0.2.1时候,可解析为192.0.2.1, PS:protocol必须为both才能启用 SlugField(CharField) 数字,字母,下划线,减号(连字符) ... UUIDField(CharField) uuid类型