环境:
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
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
@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,但是它并没有改变任何事情。
有人能帮我吗?
发布于 2020-11-05 13:08:12
要根据对象(平台)预填表单,需要将其添加到构造函数中。在edit_platform:中
form = NewPlatformForm(obj=platform)与此无关,但是要从表单中填充对象,使用populate_obj (https://wtforms.readthedocs.io/en/2.3.x/forms/#wtforms.form.Form.populate_obj)更容易。
发布于 2020-11-05 13:50:48
我懂了!
我的QuerySelectField值来自我的表类别。我试图将类别ID作为"SELECT“列表字段的预选值传递。这条路走错了。我必须从表类别中传递整个行,而不是id。
下面是完成此任务的正确代码行:
form.category.data = Category.query.filter_by(ID=platform.id_category).first()以下是激励我找到这个解决方案的答案:
https://stackoverflow.com/questions/64696233
复制相似问题