【问题标题】:wtforms CRUD - set default in SelectFieldwtforms CRUD - 在 SelectField 中设置默认值
【发布时间】: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”。

【问题讨论】:

    标签: python flask wtforms


    【解决方案1】:

    如下更新class Areas_form(FlaskForm): 中的SelectField 定义:

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

    期待您的来信:)

    祝你好运

    【讨论】:

    • 感谢您的帮助努尔阿拉。我想知道您是否可以在 HTML 方面提供更多帮助,因为我不清楚如何将您的更改转换为那里的 SelectField。我进行了您建议的更改,但下拉菜单仍默认为列表中的第一项,而不是 value=row.XXX 设置的默认值。我认为问题源于这样一个事实,即默认值是在我的代码中使用“for”循环动态设置的:
    • {% for row in area %} ....
      {{ form_edit.group.label }} {{ form_edit .group(class="form-control", value=row.group) }}
    • 感谢@Nour-Allah,我尝试了上述(两次编辑),但仍然无法正常工作。无论数据库中的值是什么,表单仍默认为列表中的第一项。令人沮丧!我将在下面发布一个示例。
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签