Python 如何在更新表单中预选QuerySelectField的值?

Python 如何在更新表单中预选QuerySelectField的值?,python,python-3.x,flask,flask-sqlalchemy,flask-wtforms,Python,Python 3.x,Flask,Flask Sqlalchemy,Flask Wtforms,环境: Python 3.7.7 烧瓶1.1.2 Werkzeug 1.0.1 简介: 我制作了一个FLask应用程序,我的用户可以在其中添加一些“平台”并编辑它们。每个平台都有一个类别 例如: 平台“Facebook”属于“社交网络”类别 平台“Instagram”属于“社交网络”类别 平台“谷歌”属于“搜索引擎”类别 新“平台”和编辑“平台”使用相同的表单和模板。在此表单中,有一个QuerySelectField,用于从DB查询加载类别值 当用户想要编辑“平台”时,他会打开“平台”窗体,在该

环境:

Python 3.7.7

烧瓶1.1.2

Werkzeug 1.0.1

简介:

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

例如:

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

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

平台“谷歌”属于“搜索引擎”类别

新“平台”和编辑“平台”使用相同的表单和模板。在此表单中,有一个QuerySelectField,用于从DB查询加载类别值

当用户想要编辑“平台”时,他会打开“平台”窗体,在该窗体的字段中填写“平台”的值。这是一个典型的形式,你可以在互联网上随处可见

新的“平台”形式运行良好

编辑“平台”表单在QuerySelectField中出现问题

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

代码:

我的表格.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')
我的路线

@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)
@app.route('/platform//edit',methods=['GET','POST'])
@需要登录
def编辑_平台(平台id):
平台=平台.查询.获取或404(平台id)
form=NewPlatformForm()
platforms\u categories=data=db\u mysql.session.query(平台,类别).join(类别).all()
#如果用户添加新平台--------------------------------------------------------
if form.validate_on_submit():
platform.name=form.name.data
platform.category\u id=form.category.data
platform.image=form.image.data
platform.description=form.description.data
platform.icon\u blue\u img=form.icon\u blue.data
platform.icon\u white\u img=form.icon\u white.data
platform.icon\u black\u img=form.icon\u black.data
db_mysql.session.commit()
flash('您的平台已更新','成功')
返回重定向(url_用于('platforms'))
#如果用户编辑现有平台--------------------------------------------------------
elif request.method==“GET”:
打印(f“platform.id_category:{platform.id_category}-{type(platform.id_category)}”)
form.name.data=platform.name
form.category.data=platform.id#u category#这里是需要预选平台类别值的选择字段。
form.image.data=platform.image
form.description.data=platform.description
form.icon\u blue.data=platform.icon\u blue\u img
form.icon\u white.data=platform.icon\u white\u img
form.icon\u black.data=platform.icon\u black\u img
返回渲染模板('new\u platform.html',title='Edit platform',form=form,legend='Edit platform',categories=platforms\u categories)
我的尝试:

我尝试了form.category.default而不是form.category.data,但没有改变任何内容


有人能帮我吗?

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

form = NewPlatformForm(obj=platform)
不相关,但要从表单填充对象,使用populate_obj()更容易些。

我明白了

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

以下是完成此工作的正确代码行:

form.category.data = Category.query.filter_by(ID=platform.id_category).first()
以下是启发我找到这个解决方案的答案:


非常感谢您的帮助,但不幸的是,它没有起作用。我的“选择”列表字段没有任何预选值。当我打印platform.id_类别时,我可以看到我得到了正确的类别id:platform.id_类别:3-。但即使将值“3”传递给form.category.data,也可以查看屏幕截图