栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

flask-admin表单:根据字段1的值约束字段2的值

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

flask-admin表单:根据字段1的值约束字段2的值

我看到解决这个问题的两种方法:

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
需要自动完成的名称。(或者您可以同时发送
query
AjaxLoader并在其中进行一些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上游贡献
真正 解决方案的人来说,这可能是一个有趣的功能请求/项目。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/624801.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号