如何在 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
我正在构建一个 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