解决QuerySelectField 默认选中问题

  • by

问题

使用Flask-WTF QuerySelectField 的时候,发现在编辑表单的时候无法设定QuerySelectField的默认选中项,举个例子。

# forms.py
class EditPostForm(FlaskForm):
    user_ids = QuerySelectField('user_id')
    ....
# routes.py
form = EditPostForm()
return render_template('EditPost.html',form=form)
# HTML Output
<select id="user_id" name="user_id">
    <option value="1">Name1</option>
    <option value="2">Name2</option>
    <option value="3">Name3</option>
</select>

这个forms在添加的时候还好,可以手动指定user_id,但是在编辑已经添加好的数据的时候,select标签无法设置原先已经设定好的user_id,又要手动设定一次。

想要的效果

如何达到我想要的效果呢?像这样selected 2:

# HTML Output
<select id="user_id" name="user_id">
    <option value="1">Name1</option>
    <option value="2" selected>Name2</option>
    <option value="3">Name3</option>
</select>

如何解决

在Google了一圈后发现… 什么form.user_id.default、process()之类的都没有用。

倒是有个师傅在reddit上写了他的解决方法,使用Jinja2的replace向选项添加一个selected属性。

直接贴代码

# routes.py
def edit_tool(title):
    tool = Tool.query.filter_by(title=title).first()
    form = AddToolForm()
    if form.validate_on ......
    form.title.data = tool.title
    form.body.data = tool.body
    ## 这里要设定tool_type.data为原先存的id,不然QuerySelectField出来的data为空
    form.tool_type.data = tool.type_id
    return render_template('admin/tool.html', form=form)
# template
{{ form.tool_type.label }}
## 使用replace将value=form.tool_type.data 替换成 selected value= xxxxx
{{ form.tool_type(class="custom-select") | replace('value="%s"'%form.tool_type.data,'selected value="%s"'%form.tool_type.data) | safe }}

发表评论

电子邮件地址不会被公开。 必填项已用*标注