【发布时间】:2021-04-07 12:20:33
【问题描述】:
我有一个 CRUD 应用程序,其中 wtforms 用于填充一系列带有“for”循环的表单,以允许用户编辑数据库中的现有数据。我使用“value=row.XXX”默认使用来自数据库的现有数据预填充表单。这适用于普通的 StringFields,但不适用于 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”。 相比之下,“description”字段从数据库中提取了“Floor 1”。
【问题讨论】: