我看到解决这个问题的两种方法:
1-当Flask-
Admin生成表单时,在选择中的每个标签上添加每个
data属性的属性。然后让一些JS代码根据所选配方过滤标签。
mid``methodArg``option``methodArg``option
编辑
这是尝试在
data-mid每个属性上放置一个属性的尝试
option:
def monkeypatched_call(self, field, **kwargs): kwargs.setdefault('id', field.id) if self.multiple: kwargs['multiple'] = True html = ['<select %s>' % html_params(name=field.name, **kwargs)] for (val, label, selected), (_, methodarg) in zip(field.iter_choices(), field._get_object_list()): html.append(self.render_option(val, label, selected, **{'data-mid': methodarg.mid})) html.append('</select>') return HTMLString(''.join(html))Select.__call__ = monkeypatched_call阻止程序是因为这些渲染调用是从jinja模板触发的,因此您几乎无法更新小部件(这
Select是WTForms中最底层的小部件,并且用作Flask-
Admin的基础
Select2Field)。
得到这些后
data-mid对你的每一个选择,你可以只用一个结合继续
change在你的食谱的选择,并显示methodarg的
option具有匹配
data-mid。考虑到Flask-
Admin的使用
select2,您可能需要做一些JS调整(最简单的丑陋解决方案是清理小部件并为每个
change触发的事件重新创建它)
总体而言,我发现该解决方案不如第二种解决方案强大。我保留了monkeypatch,以明确表示此产品不应在生产恕我直言中使用。(第二种解决方案是侵入性稍差的)
2-使用Flask-Admin中受支持的ajax-completion来破解基于所选配方的所需选项:
首先,创建一个定制的AjaxModelLoader,它将负责对数据库执行正确的选择查询:
class MethodArgAjaxModelLoader(sqla.ajax.QueryAjaxModelLoader): def get_list(self, term, offset=0, limit=10): query = self.session.query(self.model).filter_by(mid=term) return query.offset(offset).limit(limit).all()class RecipeArgAdmin(sqla.ModelView): column_list = ('recipe', 'methodarg', 'strvalue') form_ajax_refs = { 'methodarg': MethodArgAjaxModelLoader('methodarg', db.session, MethodArg, fields=['methodarg']) } column_editable_list = column_list然后,更新Flask-Admin
form.js,使浏览器向您发送配方信息,而不是
methodArg需要自动完成的名称。(或者您可以同时发送
queryAjaxLoader并在其中进行一些arg解析,因为Flask-
Admin不会进行任何解析
query,期望它是我认为是[0]的字符串。那样,您将保持自动完成)
data: function(term, page) { return { query: $('#recipe').val(), offset: (page - 1) * 10, limit: 10 };},该摘录摘自Flask-Admin的
form.js[1]
显然,这需要一些调整和参数设置(因为执行这样的hacky解决方案会阻止您在应用程序管理员的其余部分中使用其他ajax填充的select以及
form.js直接进行更新,那样升级将
Flask-Admin非常麻烦)
总体而言,我对这两个解决方案都不满意,并且此展示表明,只要您想脱离框架/工具的轨道,就可能陷入复杂的死胡同。对于那些愿意为Flask-Admin上游贡献
真正 解决方案的人来说,这可能是一个有趣的功能请求/项目。



