我有一个 CRUD 应用程序,其中使用 wtforms 填充一系列带有“for”循环的表单,以允许用户编辑数据库中的现有数据。我正在使用“value=row.XXX”作为默认值使用来自数据库的现有数据预填充表单。这适用于普通的 StringField,但不适用于 SelectField。谁能帮忙!?
下面的示例 html。 form_edit.group 是一个 SelectField。令人讨厌的是,当在表单中显示时,它默认为“选择”列表中的第一项,而不是先前选择的数据(value=row.group 不像 StringFields 那样工作)。这意味着当用户重新提交表单时,它默认为第一项。
<div class="form-group col-sm-6">
{{ form_edit.description.label }}
{{ form_edit.description(class="form-control", value=row.description) }}
{% for error in form_edit.description.errors %}
<span style="color: red;">[{{ error }}]</span>
{% endfor %}
</div>
<div class="form-group col-sm-6">
{{ form_edit.group.label }}
{{ form_edit.group(class="form-control", value=row.group) }}
{% for error in form_edit.group.errors %}
<span style="color: red;">[{{ error }}]</span>
{% endfor %}
</div>
</div>
<div class="row">
<div class="form-group col-sm-6">
{{ form_edit.qty.label }}
{{ form_edit.qty(class="form-control", value=row.qty) }}
{% for error in form_edit.qty.errors %}
<span style="color: red;">[{{ error }}]</span>
表格:
class Areas_form(FlaskForm):
hidden_id = HiddenField('Area id')
description = StringField('Description',validators=[DataRequired()])
group = SelectField('Group',validators=[DataRequired()],choices=['Ext(Am) Wall','Ext(Gnd) Wall','Roof(Am)','Flr Slab','Flr(Am)'])
qty = FloatField('Quantity', validators=[DataRequired(message='must be a number')], default=float(1))
lth_a = FloatField('Length a', validators=[DataRequired(message='must be a number')])
lth_b = FloatField('Length b', validators=[DataRequired(message='must be a number')])
assembly = SelectField('Assembly',validators=[DataRequired()], choices=[])
dev_nth = FloatField('Deviation from North', validators=[InputRequired(message='must be a number')])
ang_hor = FloatField('Angle from horizontal', validators=[InputRequired(message='must be a number')])
submit = SubmitField('Submit data')
当我按下“编辑”时,会出现以下表格。 “组”“Flr Slab”已默认回到选择列表中的第一项 - “Ext(Am) Wall”。 相比之下,“描述”字段从数据库中提取了“Floor 1”。
答案 0 :(得分:0)
更新 SelectField
中的 class Areas_form(FlaskForm):
定义如下:
group = SelectField('Group',validators=[DataRequired()],choices=[(1,'Ext(Am) Wall'),(2,'Ext(Gnd) Wall'),(3,'Roof(Am)'),(4,'Flr Slab'),(5,'Flr(Am)')])
在这里我们分配值选项以及出现的文本,最后,然后在表单提交后的代码中,您将获得作为常规列字段的值
请注意,您将使用数字 1、2、3、4 或 5 作为您在 select 中选择的映射,这会更好。
提交时添加
为了设置默认值更新
{{ form_edit.group(class="form-control", value=row.group) }}
到
{{ form_edit.group(class="form-control", value=row.group.data) }}
如果不行,检查python中type(row.group.data)
的数据类型,如果是string
类型,更新group
列定义为:
group = SelectField('Group',validators=[DataRequired()],choices=[('1','Ext(Am) Wall'),('2','Ext(Gnd) Wall'),('3','Roof(Am)'),('4','Flr Slab'),('5','Flr(Am)')])
如果我们强制使用整数值,请在添加前将 coerce=int
添加到我的第一个建议的末尾,如下所示:
group = SelectField('Group',validators=[DataRequired()],choices=[(1,'Ext(Am) Wall'),(2,'Ext(Gnd) Wall'),(3,'Roof(Am)'),(4,'Flr Slab'),(5,'Flr(Am)'),coerce=int])
期待收到您的来信:)
祝你好运