如何在 Flask Admin 上创建 Ajax 表单域

How to do an Ajax form field on Flask Admin

我正在构建一个 Flask-Admin 应用程序,它使用 REST API 作为其后端数据库,我已将其实现为我自己的 BaseModelView。我已将其与自定义模型一起使用,并实现了编辑和保存模型的所有功能。

但是我有一个字段 User,它需要根据 name/email 搜索另一个 REST API 端点以获得用户 ID,并且由于预计用户列表会变得相当大,我希望该字段是一个 AJAX 查找,正如我在 SQLAlchemy 示例中看到的那样,通过 Select2/Ajax.

查找外键

因为我需要自己的 Ajax 查询,所以我通过关注文档和通读代码,努力寻找一个如何自己实现它的工作示例,并且想知道是否有人可以指导我.

我已经尝试实现 AjaxSelectField 并使用 BaseModelView 的 form_ajax_refs 属性 覆盖表单的用户字段(在 scaffold_form 方法中创建) 没有成功。

有没有人举例说明如何在我的模型表单上放置自定义 Select2 Ajax 查找字段,从 REST API 查找数据,以便我可以搜索用户当我 create/edit 模型时分配给模型的 ID?

终于弄明白了,你必须向你的 BaseModelView 添加 2 个东西才能做到这一点:

在您的 BaseModelView 中 class - 使用自定义模型表单将 AjaxSelectField 添加到您的表单中:

def scaffold_form(self):
  class AccountForm(Form):
    owner =  AjaxSelectField(UserAjaxModelLoader('owner'),
                                     label='Owner', blank_text="Select User...")
  return AccountForm

然后添加对您的 form_ajax_refs 字段的引用:

form_ajax_refs = {
    'owner': UserAjaxModelLoader('owner')
}

最后 UserAjaxModelLoader class 的实现提供了 AJAX 端点并将它们串在一起:

from flask_admin.model.ajax import AjaxModelLoader, DEFAULT_PAGE_SIZE

class UserAjaxModelLoader(AjaxModelLoader):

    def __init__(self, name, **options):
        super(UserAjaxModelLoader, self).__init__(name, options)

    def format(self, model):
        if model:
            return (model.uid, model.email)

        return None

    def get_one(self, pk):
        return auth.get_user(pk)

    def get_list(self, query, offset=0, limit=DEFAULT_PAGE_SIZE):

        # Put your code to search REST API for users here

        return users