【发布时间】:2017-02-11 22:53:55
【问题描述】:
我正在尝试使用 Flask + WTForms + Select2(ajax 调用)实现一个网络应用程序,但不幸的是没有取得很大成功。主要问题与我的 WTForms 类之一中的属性“选择”有关,因为我无法理解如何使用 ajax 调用填充选择菜单并让 WTForms 类管理这些数据。 这是我的解决方法:
class insertData(FlaskForm):
...
feature_tag = SelectMultipleField(
u'Features',
choices=[(0, "")],
coerce=int,
render_kw={"multiple": "multiple"},
id="feature_tag_sel2")
...
这是在模板中调用的:
<div class="col-sm-4">
{{form.feature_tag}}
</div>
由 Select2 管理:
$("#feature_tag_sel2").select2({
minimumInputLength: 2,
ajax: {
url: "/select/api/feature",
dataType: 'json',
data: function (params) {
return { q: params.term };
},
processResults: function (data) {
return {results: data};
},
cache: false
}
});
最后,ajax 调用引用了这段代码:
@app.route('/select/api/feature')
def suggestion_feature():
param = request.args.get('q', '')
q = db.session.query(Feature).filter(Feature.nome_f.startswith(param)).all()
value = [dict(id=i.id, text=i.nome_f) for i in q]
return json.dumps(value)
当此代码运行时,无论选择的值是什么,validate_on_submit 都会出现错误:我可以从 Select2 菜单中选择许多值,但当然任何与 0 不同的值都不是有效的选择。然后我试图通过实现一个新的字段定义来阻止这个错误的传播:
class Select2MultipleField(SelectMultipleField):
def pre_validate(self, form):
# Prevent "not a valid choice" error
pass
此代码有效,但无论如何它是一种解决方法。例如,当validate_on_submit 在表单中发现另一个错误并重新加载页面时,所有选定的值都会丢失。当我需要编辑数据时也会发生同样的情况。总而言之,这种解决方法让我失去了 WTForms 的许多优点。
因此问题是:是否有任何方法可以将 WTForms SelectField 与通过 ajax 调用检索到的数据集成?
2021 年 10 月 8 日编辑
对于仍然对此事感兴趣的任何人,我找到了以下解决方案:Flask-Select2。它很好地集成到代码中,几乎不需要修改。唯一的缺陷是它仅适用于 Select2 版本。 3(对于Select2当前版本的更新,有几点需要重写)
【问题讨论】:
-
你找到解决办法了吗?
标签: ajax flask jquery-select2 flask-wtforms wtforms