首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在更新表单中预选我的QuerySelectField瓶的值?

如何在更新表单中预选我的QuerySelectField瓶的值?
EN

Stack Overflow用户
提问于 2020-11-05 11:26:06
回答 2查看 297关注 0票数 0

环境:

Python 3.7.7

瓶1.1.2

韦克祖格1.0.1

简介:

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

例如:

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

"Instagram“平台属于”社会网络“范畴。

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

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

当用户想编辑"Platform“时,他打开"Platform”表单,其中"Platform“的值被填充在字段中。这是一个典型的形式,你可以在互联网上随处可见。

新的“平台”形式工作得很好。

编辑"Platform“表单正在窃听QuerySelectField。

我成功地在"Platform“表单的文本字段中填充了"Platform”的值,但是我对QuerySelectField (类别)有一个问题。它不想预选平台类别的值。

代码:

我的forms.py

代码语言:javascript
复制
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')

我的routes.py

代码语言:javascript
复制
@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,但是它并没有改变任何事情。

有人能帮我吗?

EN

回答 2

Stack Overflow用户

发布于 2020-11-05 13:08:12

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

代码语言:javascript
复制
form = NewPlatformForm(obj=platform)

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

票数 0
EN

Stack Overflow用户

发布于 2020-11-05 13:50:48

我懂了!

我的QuerySelectField值来自我的表类别。我试图将类别ID作为"SELECT“列表字段的预选值传递。这条路走错了。我必须从表类别中传递整个行,而不是id。

下面是完成此任务的正确代码行:

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64696233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档