我在Flask-Admin中有一个带过滤器的模型(例如基于其他模型的外键)。
我希望在admin中生成从前端到此模型视图的链接,并应用过滤器值。我注意到它将?flt0_0=
添加到url
,因此整个地址看起来有点:
http:/.../admin/model_view_<my model>/?flt0_0=<filter value>
哪种方式可以生成这样的路线?
答案 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
在flt
参数中添加了排序键,然后我可以强制这些过滤器以不同的顺序显示({{1}将在flt1
之前出现):
flt2
实际上,此排序键可以是任何单个字符,例如这也可以:
?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