Flask-Admin:应用过滤器的模型视图路径

时间:2016-03-06 21:53:40

标签: python flask flask-admin

我在Flask-Admin中有一个带过滤器的模型(例如基于其他模型的外键)。

我希望在admin中生成从前端到此模型视图的链接,并应用过滤器值。我注意到它将?flt0_0=添加到url,因此整个地址看起来有点:

http:/.../admin/model_view_<my model>/?flt0_0=<filter value>

哪种方式可以生成这样的路线?

3 个答案:

答案 0 :(得分:4)

不幸的是,目前还没有公共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')

答案 1 :(得分:3)

我更喜欢在我的基本视图上设置named_filter_urls=True来摆脱这些神奇的数字(尽管你也可以在任何特定视图上设置它):

class MyBaseView(BaseModelView):
    ...
    named_filter_urls = True


class MyView(MyBaseView):
    ...
    column_filters = ['name', 'country']

这会创建以下网址:http://.../admin/model/?flt_name_equals=foo&flt_country_contains=bar(*)

通过此功能,您可以使用要过滤的属性名称轻松构建网址。作为奖励,您不需要有可用的视图实例 - 如果您想要链接到不同模型的视图,这一点非常重要。

*(从UI中选择过滤器时,Flask-Admin会将整数插入到参数键中。我不知道为什么会这样做,但它们似乎不是简单过滤所必需的。)

答案 2 :(得分:3)

如果您的应用需要支持多种语言,

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参数中添加了排序键,然后我可以强制这些过滤器以不同的顺序显示({{1}将在flt1之前出现):

flt2

收益率:Forced filter ordering

实际上,此排序键可以是任何单个字符,例如这也可以:

?flt2_balance_smaller_than=100&flt1_balance_greater_than=5

此行为最终在以下Flask-Admin ?fltB_balance_smaller_than=100&fltA_balance_greater_than=5 方法中定义: https://github.com/flask-admin/flask-admin/blob/master/flask_admin/model/base.py#L1714-L1739