django.forms 深入理解form的逻辑

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.1 赋值 data and files,set self.is_bound=True
    1.2 字段排序order_fields
    1.2 获取renderer

  2. 检测 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
  1. 保存 cleaned_data

Note

  1. 所以想要设置初始值可以从 初始化 initial 参数 或者给field 添加 initial
  2. 想要给 form 添加 class="":要给 field添加 css_classes(self, extra_classes=None)
  3. 想要给 field 添加额外属性 传递给field.as_widget(self, widget=None, attrs=None, only_initial=False)
  4. 在模板里自定义一个 tag 给传递 attr 和 class

GET 一个空表或者一个预填充了数据的表
POST 提交填好的表单:
验证成功,保存数据,跳转
验证失败,返回消息提示

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值