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