【问题标题】:How to preselected a value of my QuerySelectField Flask in my Update form?如何在我的更新表单中预选我的 QuerySelectField Flask 的值?
【发布时间】:2020-11-05 11:26:06
【问题描述】:

环境:

Python 3.7.7

烧瓶 1.1.2

Werkzeug 1.0.1

简介:

我制作了一个 Flask 应用程序,我的用户可以在其中添加一些“平台”并对其进行编辑。每个平台都有一个类别。

例如:

平台“Facebook”属于“社交网络”类别。

平台“Instagram”属于“社交网络”类别。

平台“Google”属于“搜索引擎”类别。

新建“平台”和编辑“平台”使用相同的表单和相同的模板。在这种形式中,有一个 QuerySelectField 从数据库查询中加载类别值。

当用户想要编辑“平台”时,他打开“平台”表单,其中“平台”的值被填写在字段中。这是一种典型的形式,在互联网上随处可见。

新的“平台”表单运行良好。

编辑“平台”表单与 QuerySelectField 存在问题。

我成功地在“平台”表单的文本字段中填写了“平台”的值,但是 QuerySelectField(类别)存在问题。它不想预先选择平台类别的值。

代码:

我的表单.py

def GetCategories():
    """
    This function is to fill the selectdropdown field of the form NewPlatformForm
    :return:
    """
    return Category.query

class NewPlatformForm(FlaskForm):

    name = StringField('Name', validators=[DataRequired(), Length(min=2, max=20)])
    category = QuerySelectField('Category', validators=[DataRequired()], query_factory=GetCategories, get_label='name')
    image = StringField('Image',validators=[DataRequired(), Length(min=4, max=100)])
    description = TextAreaField('Description',render_kw={'rows':20},validators=[DataRequired(), Length(min=2, max=1200)])
    icon_blue = StringField('Icon blue')
    icon_black = StringField('Icon black')
    icon_white = StringField('Icon white')
    submit = SubmitField('Save')

我的路线.py

@app.route('/platform/<int:platform_id>/edit', methods=['GET', 'POST'])
@login_required
def edit_platform(platform_id):
    platform = Platform.query.get_or_404(platform_id)
    form = NewPlatformForm()
    platforms_categories = data = db_mysql.session.query(Platform, Category).join(Category).all()
    #IF USER ADD A NEW PLATFORM --------------------------------------------------------
    if form.validate_on_submit():
        platform.name = form.name.data
        platform.category_id = form.category.data
        platform.image = form.image.data
        platform.description = form.description.data
        platform.icon_blue_img = form.icon_blue.data
        platform.icon_white_img = form.icon_white.data
        platform.icon_black_img = form.icon_black.data
        db_mysql.session.commit()
        flash('Your platform has been updated', 'success')
        return redirect(url_for('platforms'))
    #IF USER EDIT AN EXISTING PLATFORM --------------------------------------------------------
    elif request.method == 'GET':
        print(f"platform.id_category : {platform.id_category} - {type(platform.id_category)}")
        form.name.data = platform.name
        form.category.data = platform.id_category #Here is the Select field which needs to preselect the Category value of platform.
        form.image.data = platform.image
        form.description.data = platform.description
        form.icon_blue.data = platform.icon_blue_img
        form.icon_white.data = platform.icon_white_img
        form.icon_black.data = platform.icon_black_img

    return render_template('new_platform.html', title='Edit Platform', form=form, legend='Edit Platform',categories=platforms_categories)

我尝试了什么:

我尝试了 form.category.default 而不是 form.category.data 但它没有改变任何东西。

有人可以帮帮我吗?

【问题讨论】:

    标签: python python-3.x flask flask-sqlalchemy flask-wtforms


    【解决方案1】:

    要根据对象(平台)预填表单,需要将其添加到构造函数中。 在edit_platform:

    form = NewPlatformForm(obj=platform)
    

    不相关但要从表单中填充对象,使用populate_obj(https://wtforms.readthedocs.io/en/2.3.x/forms/#wtforms.form.Form.populate_obj)更容易

    【讨论】:

    • 非常感谢您的帮助,但不幸的是,它不起作用。我的“选择”列表字段没有预选任何值。当我打印 platform.id_category 时,我可以看到我得到了正确的类别 ID:platform.id_category : 3 - 。但即使将值“3”传递给 form.category.data,请参阅屏幕截图prntscr.com/ve169u
    【解决方案2】:

    我明白了!

    我的 QuerySelectField 值来自我的表类别。 我试图将类别 ID 作为“SELECT”列表字段的预选值传递。 这是错误的方式。我必须从表 Category 而不是 id 传递整行。

    这是完成这项工作的正确代码行:

    form.category.data = Category.query.filter_by(ID=platform.id_category).first()
    

    这是启发我找到这个解决方案的答案:

    Flask/WTForms/QuerySelectField - render QuerySelectField with a choice selected based on existing database value

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-19
      • 1970-01-01
      • 2020-02-14
      • 2015-08-14
      相关资源
      最近更新 更多