渲染Form
- 手工渲染字段:{{ form.name_of_field }
- 渲染某个字段的错误提示信息{{ form.name_of_field.errors }}
- 得到某个字段的label的id{{ form.name_of_field.id_for_label}}
- 得到某个字段的label名:{{ form.name_of_field.label }}
创建表单类的一些有用的总结
- 一个Form类可以继承自
forms.Form
和forms.ModelForm
,前者用来做查询表单,后者做可以查询和修改的表单 - Form类的元类:
- 元类的model属性用来控制该表单关联的model
- fields控制从关联的model中取出哪些属性作为表单的字段
- widgets属性控制你的form的属性所使用的widget,其用法同单独写一个属性时设置的widget属性,注意两个不同地方的属性名称注意最后的s
- 我们可以重写表单的init方法 添加一些我们的初始化的操作
class YsryYdMainForm(forms.ModelForm):
class Meta:
model = YdMain
fields = [
'yd_id',
'question_amount',
'yd_commit_case',
'yd_commit_manid',
'yd_commit_date',
'inspect_com',
'yd_made_date',
]
widgets = {'yd_commit_case': forms.Textarea()}
def __init__(self, *args, **kwargs):
super(YsryYdMainForm, self).__init__(*args, **kwargs)
for field_name in self.fields:
field = self.fields.get(field_name)
if type(field) == forms.ModelChoiceField:
field.widget.attrs.update({
'class':
'form-control selectpicker',
'data-live-search':
'true',
})
elif type(field) == forms.ModelMultipleChoiceField:
field.widget.attrs.update({
'class': 'form-control m2mselect',
})
elif type(field) == forms.DateField:
field.widget.attrs.update({
'class': 'form-control',
'readonly': '',
})
else:
field.widget.attrs.update({'class': 'form-control'})
- 表单中一些字段让系统自动填值:我们需要自动填值的字段不在页面中显示,但是需要在form类的字段中有,不然当你往form类的对象中添加属性保存时会报错。
在views中动态控制表单的下拉选择控件的内容
- 由于要使用到request所以只能在views中控制,否则可以在forms中直接控制
ydform=YdMainForm()
ydform.fields.get(
'project').widget.choices.queryset = Project.objects.filter(
people=request.user.people.people_id)
表单类的填写使用总结
- 单独的填写入库的操作中,form表单的is_valid验证只验证form类中包含的表单字段,form类中不包含的字段,即使其model中是必填项,form类的验证依旧可以通过且可以强制入库。
- 也就是说form类的验证一旦通过,form类的save就可以被执行,而且是强制执行。
- 如果你只需要更改一张form类的一部分字段的值,那么你的form类定义Meta时要指明,不在form类定义的字段,不会再填写时收到影响。
- form类字段自然循环的顺序与model类中属性放置的顺序相同
- 如果是这样一个场景:你要使用form类去生成表单并保存你的表单中的输入内容,此时有几个字段你不让人员手工填写,需要后台自动填写时,你可以不在前台显示该字段,在后台给表单传入request.POST的一个复制,在其中添加需要后台赋值的值。
使用Form和ModelForm保存数据的方法
- 简单来讲使用Form类表单来实现数据提交保存数据需要利用Form表单的is_valid方法验证表单内容后,使用clean_data获取表单的值,最后通过使用Model手动创建一个新的对象并保存进入数据库。
- 使用ModelForm保存数据就是当ModelForm的is_valid表单校验通过后,使用ModelForm的save方法直接就可实现对数据的保存入库。