Flask-Admin:路由到应用过滤器的模型视图
Flask-Admin: route to models view with filter applied
我在 Flask-Admin 中有一个带有过滤器的模型(例如,基于其他模型的外键)。
我想在管理中生成从前端到此模型视图的链接,并应用过滤器值。我注意到它将 ?flt0_0=
添加到 url
,因此整个地址看起来有点像:
http:/.../admin/model_view_<my model>/?flt0_0=<filter value>
生成这样的路由的最佳方法是什么?
遗憾的是,目前还没有 public 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_filter_urls=True
以摆脱这些幻数(尽管您也可以在任何特定视图上设置它):
class MyBaseView(BaseModelView):
...
named_filter_urls = True
class MyView(MyBaseView):
...
column_filters = ['name', 'country']
这会创建如下 URL:http://.../admin/model/?flt_name_equals=foo&flt_country_contains=bar
(*)
有了这个,您的 URL 可以很容易地使用您要过滤的属性的名称来构造。作为奖励,您不需要有可用的视图实例 - 如果您想 link 到不同模型的视图,这很重要。
*(当从 UI 中选择过滤器时,Flask-Admin 会在参数键中插入整数。我不确定它为什么这样做,但它们似乎不是简单过滤所必需的。)
如果您的应用需要支持多种语言,Flask-Admin 默认将 flt0_0=<value>
语法设为 "robust across translations"。如果您不需要担心翻译,设置 named_filter_urls=True
是正确的选择。
使用 named_filter_urls=True
Flask-Admin 生成过滤器查询参数,如:
flt0_country_contains=<value>
flt
之后的剩余整数(在本例中为 0
)是一个排序键,用于控制过滤器在 UI 中出现的顺序,当您有多个过滤器定义。 如果您只有一个过滤器,这个数字根本无关紧要。
例如,在我的应用程序中,我已启用命名过滤器。如果我有多个过滤器 没有排序键 过滤器将以 它们在查询字符串中出现的顺序显示 :
?flt_balance_smaller_than=100&flt_balance_greater_than=5
产量:Default filter ordering
将排序键 添加到 flt
参数,然后我可以强制这些过滤器以不同的顺序显示(flt1
会在 flt2
之前):
?flt2_balance_smaller_than=100&flt1_balance_greater_than=5
产量:Forced filter ordering
实际上,这个排序键看起来可以是任何单个字符,例如这也有效:
?fltB_balance_smaller_than=100&fltA_balance_greater_than=5
此行为最终在此处的 Flask-Admin BaseModelView._get_list_filter_args()
方法中定义:
https://github.com/flask-admin/flask-admin/blob/master/flask_admin/model/base.py#L1714-L1739
我在 Flask-Admin 中有一个带有过滤器的模型(例如,基于其他模型的外键)。
我想在管理中生成从前端到此模型视图的链接,并应用过滤器值。我注意到它将 ?flt0_0=
添加到 url
,因此整个地址看起来有点像:
http:/.../admin/model_view_<my model>/?flt0_0=<filter value>
生成这样的路由的最佳方法是什么?
遗憾的是,目前还没有 public 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_filter_urls=True
以摆脱这些幻数(尽管您也可以在任何特定视图上设置它):
class MyBaseView(BaseModelView):
...
named_filter_urls = True
class MyView(MyBaseView):
...
column_filters = ['name', 'country']
这会创建如下 URL:http://.../admin/model/?flt_name_equals=foo&flt_country_contains=bar
(*)
有了这个,您的 URL 可以很容易地使用您要过滤的属性的名称来构造。作为奖励,您不需要有可用的视图实例 - 如果您想 link 到不同模型的视图,这很重要。
*(当从 UI 中选择过滤器时,Flask-Admin 会在参数键中插入整数。我不确定它为什么这样做,但它们似乎不是简单过滤所必需的。)
如果您的应用需要支持多种语言,Flask-Admin 默认将 flt0_0=<value>
语法设为 "robust across translations"。如果您不需要担心翻译,设置 named_filter_urls=True
是正确的选择。
使用 named_filter_urls=True
Flask-Admin 生成过滤器查询参数,如:
flt0_country_contains=<value>
flt
之后的剩余整数(在本例中为 0
)是一个排序键,用于控制过滤器在 UI 中出现的顺序,当您有多个过滤器定义。 如果您只有一个过滤器,这个数字根本无关紧要。
例如,在我的应用程序中,我已启用命名过滤器。如果我有多个过滤器 没有排序键 过滤器将以 它们在查询字符串中出现的顺序显示 :
?flt_balance_smaller_than=100&flt_balance_greater_than=5
产量:Default filter ordering
将排序键 添加到 flt
参数,然后我可以强制这些过滤器以不同的顺序显示(flt1
会在 flt2
之前):
?flt2_balance_smaller_than=100&flt1_balance_greater_than=5
产量:Forced filter ordering
实际上,这个排序键看起来可以是任何单个字符,例如这也有效:
?fltB_balance_smaller_than=100&fltA_balance_greater_than=5
此行为最终在此处的 Flask-Admin BaseModelView._get_list_filter_args()
方法中定义:
https://github.com/flask-admin/flask-admin/blob/master/flask_admin/model/base.py#L1714-L1739