Python Flask Admin:在应用过滤器的情况下路由到模型视图
我在Flask Admin中有一个带有过滤器的模型(例如,基于其他模型的外键) 我想在管理员中生成从前端到该模型视图的链接,并应用过滤器值。我注意到它将Python Flask Admin:在应用过滤器的情况下路由到模型视图,python,flask,flask-admin,Python,Flask,Flask Admin,我在Flask Admin中有一个带有过滤器的模型(例如,基于其他模型的外键) 我想在管理员中生成从前端到该模型视图的链接,并应用过滤器值。我注意到它将?flt0_0=添加到url,因此整个地址看起来有点像: http:/…/admin/model\u view\u/?flt0\u 0= 生成这样的路由的最佳方法是什么?不幸的是,目前还没有用于此目的的公共API。下面是一个简短的代码段,您现在可以使用它生成fltX_Y查询字符串: class MyView(BaseModelView): ...
?flt0_0=
添加到url
,因此整个地址看起来有点像:
http:/…/admin/model\u view\u/?flt0\u 0=
生成这样的路由的最佳方法是什么?不幸的是,目前还没有用于此目的的公共API。下面是一个简短的代码段,您现在可以使用它生成fltX_Y查询字符串:
class MyView(BaseModelView):
...
def get_filter_arg(self, filter_name, filter_op='equals'):
filters = self._filter_groups[filter_name].filters
position = self._filter_groups.keys().index(filter_name)
for f in filters:
if f['operation'] == filter_op:
return 'flt%d_%d' % (position, f['index'])
然后可以在视图实例上调用此方法:
print my_view.get_filter_arg('Name', 'contains')
我更喜欢在我的基本视图上设置
named\u filter\u url=True
,以消除这些神奇的数字(尽管您也可以在任何特定视图上设置):
这会创建如下URL:http://.../admin/model/?flt_name_equals=foo&flt_country_contains=bar
(*)
这样,就可以使用要筛选的属性的名称轻松构建URL。作为奖励,您不需要有可用的视图实例——如果您想链接到不同模型的视图,这一点很重要
*(当从UI中选择过滤器时,Flask Admin将在参数键中插入整数。我不确定为什么会这样做,但它们似乎不是简单过滤所必需的。)Flask Admin默认为
flt0\u 0=
语法,如果您的应用程序需要支持多种语言。如果您不需要担心翻译,那么设置named\u filter\u url=True
就是一个好办法
使用named\u filter\u url=True
Flask Admin生成如下过滤器查询参数:
flt0_country_contains=<value>
收益率:
将排序键添加到flt
参数,然后我可以强制以不同的顺序显示这些过滤器(flt1
将出现在flt2
之前):
收益率:
实际上,该排序键可以是任何单个字符,例如:
?fltB_balance_smaller_than=100&fltA_balance_greater_than=5
此行为最终在Flask AdminBaseModelView中定义。\u获取\u列表\u筛选\u参数()
方法:
我不确定是否使用它,因为使用多个过滤器时会导致许多不可预测的行为
?flt_balance_smaller_than=100&flt_balance_greater_than=5
?flt2_balance_smaller_than=100&flt1_balance_greater_than=5
?fltB_balance_smaller_than=100&fltA_balance_greater_than=5