django.forms 深入理解form的逻辑
form 的组成
form 表示一个表单对象,由 form_class 创建
form 由 field 组成,包含各种字段
field 由 data 和 widget 组成
field
Field
所有 field 的基类
默认初始化内容
required = True 必填
widget = TextInput 默认控件
label = None 标签
initial = None 初始展示值
help_text = ‘’ 控件的帮助
error_messages = None 错误信息 是一个字典 根据错误返回处理信息 默认是default_error_messages = {'required': _('This field is required.'),}
show_hidden_initial = False 是否显示hidden字段的初始值
validators = () 校验器
localize = False 是否本地化
disabled = False 不可编辑
label_suffix = None 标签后缀 如’:’
可控方法:
prepare_value(value) # 准备内容 比如把时间日期转换为当前时区的值
to_python(value) # 反序列化 把字符串转换为 python 对象
validate(value) # 校验成功或者抛出 ValidationError 包含错误代码
run_validators(value) # 使用 self.validators 依次校验
clean(value) #执行 to_python validate run_validators 返回干净的数据
bound_data(data,initial) # 控件不可编辑则返回初始化数据 或 data
widget_attrs(widget) #重写增加widget的html属性字典
has_changed(initial,data) # 返回数据是否发生变化
get_bound_field(self, form, field_name) #获取一个绑定字段?
deepcopy(self, memo) #深拷贝不能对对象使用,要具体实现
CharField
额外属性
max_length
min_length
strip = True # 去首尾空格
empty_value = ‘’
重载方法
widget_attrs: attrs[‘maxlength’] = str(self.max_length) attrs[‘minlength’] = str(self.min_length)
IntegerField
基础属性
widget = NumberInput
default_error_messages = {‘invalid’: _(‘Enter a whole number.’),}
额外属性
max_value
min_value
重载方法
widget_attrs: attrs[‘min’] = self.min_value attrs[‘max’] = self.max_value
FloatField
–> IntergerField
DecimalField
–> IntergerField
DateField TimeField DateTimeField
widget = DateInput TimeInput DateTimeInput
DurationField
时间间隔
解析与反解析
duration_string(value)
parse_duration(str(value))
RegexField
正则表达式字段
regex 可以是 string 也可以是 re.compile 的对象
EmailField
EmailInput
validators.validate_email
FileField
ClearableFileInput
ImageField
–>FileField
URLField
URLInput
validators.URLValidator()
BooleanField
CheckboxInput
NullBooleanField
NullBooleanSelect
ChoiceField
Select 单选框
MultipleChoiceField
MultipleHiddenInput 多选框
ComboField
组合框
MultiValueField
SplitDateTimeField
SplitDateTimeWidget 分开的日期时间
GenericIPAddressField
IP地址字段
FilePathField
文件路径
–>ChoiceField
SlugField
–>CharField
TypedChoiceField
TypedMultipleChoiceField
UUIDField
–>CharField
form
基本属性
data=None 传入的值
files=None 包含的文件
auto_id=‘id_%s’ 表单id
prefix=None 前缀
initial=None 初始化字典
error_class=ErrorList 错误类型
label_suffix=None 标签后缀
empty_permitted=False 可以为空
field_order=None 字段排序
use_required_attribute=None 是否必须
renderer=None 渲染器
基本方法
order_fields
as_table
as_p
as_ul
changed_data #修改了的字段
is_multipart
hidden_fields
visible_fields
get_initial_for_field 获取初始化对象
form 的逻辑
-
初始化
1.1 赋值 data and files,set self.is_bound=True
1.2 字段排序order_fields
1.2 获取renderer -
检测 is_valid()
self.is_bound 有数据返回
not self.errors
self.full_clean()
self.cleaned_data={} # 初始化clean_data
self._clean_fields() # 清理各个字段
get_initial_for_field(field, field_name) # 获取各个字段的初始值
value = self.initial.get(field_name, field.initial) # 从self.initial 获取或者从 field.initial 获取
self.cleaned_data[name] = value
self._clean_form() # 清理表单
cleaned_data = self.clean()
self._post_clean() # 后处理钩子
pass
- 保存 cleaned_data
Note
- 所以想要设置初始值可以从 初始化 initial 参数 或者给field 添加 initial
- 想要给 form 添加
class=""
:要给 field添加 css_classes(self, extra_classes=None) - 想要给 field 添加额外属性 传递给field.as_widget(self, widget=None, attrs=None, only_initial=False)
- 在模板里自定义一个 tag 给传递 attr 和 class
GET 一个空表或者一个预填充了数据的表
POST 提交填好的表单:
验证成功,保存数据,跳转
验证失败,返回消息提示