关于如何使用WTForms'真的缺乏文档。 FieldList中。所以,多亏了互联网,我能够将以下内容合并在一起:
形式:
class BranchForm(Form):
name = StringField('Name', validators = [Required()])
equipment = FieldList(SelectField('Equipment', validators=[Required()], coerce=int,
choices = [(x.id, x.name) for x in Equipment.query.all()]))
mod = FieldList(StringField('Method of Delivery', validators = [Optional()]))
查看:
def edit_branch(id):
branch = Branch.query.filter_by(id=id).first()
#populate data_in to be used by BranchForm
data_in = []
for eq_obj in branch.equipment_assoc:
data_in.append(('equipment', eq_obj.equipment.id))
data_in.append(('mod', eq_obj.mod))
editform = BranchForm(data=MultiDict(data_in))
if editform.validate_on_submit():
branch.name = editform.name.data
db.session.add(branch)
db.session.commit()
return redirect('/admin/branches/' + str(branch.id))
editform.name.data = branch.name
return render_template("branch_edit.html",
title="Edit Branch",
branch = branch,
editform = editform)
让我失望的是,在我使用WTForm表单并使用我的数据库中的数据(如编辑表单)填充字段的其他地方,我不得不填充这些内容。 form.validate_on_submit()块之后的表单字段,因为如果没有,那么表单永远不会更新,因为提交的内容会立即被覆盖。
参见" editform.name.data = branch.name" (这就是我一直这样做的方式)
从我在网上发现的关于填充FieldList的每个例子来看,显然必须在实例化期间完成,但是必须在validate_on_submit()之前实例化表单,因为validate_on_submit()是表单的一个方法宾语。
参见" editform = BranchForm(data = MultiDict(data_in))" (这就是我在所见过的所有例子中看到FieldLists的情况。)
如何使用字段列表填充表单?
答案 0 :(得分:1)
好吧,所以一个伙伴帮我解决了这个问题。这就是我最终的结果:
形式:
class BranchForm(Form):
name = StringField('Name', validators = [Required()])
equipment = FieldList(SelectField('Equipment', validators=[Required()], coerce=int,
choices = [(x.id, x.name) for x in Equipment.query.all()]))
mod = FieldList(StringField('Method of Delivery', validators = [Optional()]))
def populate_assoc(self, branch_obj):
i = 0
branch_obj.name = self.name.data
for assoc_obj in branch_obj.equipment_assoc:
assoc_obj.equipment_id = self.equipment[i].data
assoc_obj.mod = self.mod[i].data
i += 1
查看:
def edit_branch(id):
branch = Branch.query.filter_by(id=id).first()
if request.method == 'POST':
editform = BranchForm()
if editform.validate_on_submit():
editform.populate_assoc(branch)
db.session.add(branch)
db.session.commit()
return redirect('/admin/branches/' + str(branch.id))
#populate data_in to be used
data_in = []
for eq_obj in branch.equipment_assoc:
data_in.append(('equipment', eq_obj.equipment.id))
data_in.append(('mod', eq_obj.mod))
editform = BranchForm(data=MultiDict(data_in))
editform.name.data = branch.name
return render_template("branch_edit.html",
title="Edit Branch",
branch = branch,
editform = editform)
诀窍真的是不再使用 form.validate_on_submit()作为我的逻辑分隔符,因为它依赖于表单对象。他的想法是为此目的使用 if request.method =='POST':。这样我就可以用两种不同的方式实例化我的表单。一个填充显示,另一个只在请求方法是POST时实例化,从而保留表单中提交的信息。
为了完成这项工作,我将populate_assoc方法添加到我的表单类中,以便我可以轻松地将表单中的信息放入我的关联模型中。
答案 1 :(得分:0)
WtForms有一个populate_obj()方法。也许这就是你所追求的?
def edit_branch(id):
branch = Branch.query.filter_by(id=id).first()
editform = BranchForm(obj=branch)
if editform.validate_on_submit():
editform.populate_obj(branch)
db.session.commit()
return redirect('/admin/branches/' + str(branch.id))
return render_template("branch_edit.html",
title="Edit Branch",
branch = branch,
editform = editform)