Flask-admin如何为视图/端点配置可手动禁用的默认过滤器
实现方案
你不需要修改get_url方法,只需要重写ModelView的过滤器参数处理逻辑,在用户没有主动设置过滤器时注入默认过滤规则即可,同时要将参数同步到请求上下文,保证前端能渲染出可关闭的过滤器标签。
步骤1:修正自定义过滤器的声明
首先你需要在column_filters中实例化自定义过滤器,指定绑定的列:
column_filters = ['id', 'name', FilterLabels(column=User.label, name='label')]
步骤2:重写过滤器参数处理方法
在MyView类中添加如下逻辑:
from flask import request class MyView(ModelView): column_list = ('id', 'name', 'label') column_searchable_list = column_list # 修正过滤器声明 column_filters = ['id', 'name', FilterLabels(column=User.label, name='label')] def _get_list_filter_args(self): # 获取父类原生处理的过滤器参数 args = super()._get_list_filter_args() # 仅当用户没有主动设置任何过滤器时生效默认规则 if not args and not request.args.get('flt'): # 规则格式:(过滤器在column_filters中的索引, 操作索引, 过滤值) # 此处过滤器索引为2(前两个是id、name),操作只有equals所以索引为0,过滤值0对应True args = [(2, 0, '0')] # 同步参数到请求对象,让前端渲染出可关闭的过滤器标签 request.args = request.args.copy() request.args.setlist('flt', ['2-0-0']) return args def is_accessible(self): return True
索引确认方法
如果你不确定过滤器对应的索引值,可以先手动在页面开启对应过滤器,查看地址栏中flt参数的值,直接替换代码中的2-0-0即可。
该实现效果为:首次访问页面时默认开启label=True的过滤器,页面会显示对应的激活过滤器标签,点击标签上的关闭按钮即可取消过滤,刷新后不会再强制生效。
内容的提问来源于stack exchange,提问作者PicxyB
相关产品推荐
相关产品推荐

