wtforms CRUD - 在 SelectField 中设置默认值

时间:2020-12-31 03:47:58

标签: python flask wtforms

我有一个 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')

示例行: enter image description here

当我按下“编辑”时,会出现以下表格。 “组”“Flr Slab”已默认回到选择列表中的第一项 - “Ext(Am) Wall”。 相比之下,“描述”字段从数据库中提取了“Floor 1”。

enter image description here

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])

期待收到您的来信:)

祝你好运

相关问题