如何在Django中动态构建支持多级逻辑分组的层级搜索表单
我正在使用Django为一个科学数据库搭建高级搜索页面,目标是支持用户动态创建复杂搜索条件,通过and和or拼接不同搜索词组。
我参考相关教程实现了部分功能:可以创建多组搜索条件,全部以and拼接,本质是单个动态生成的搜索词组,支持统一用and或者or拼接,示例如下:
<field1|field2> <is|is not|contains|doesn't contain> <search term> <->"<+>
其中<->"用于删除搜索条件行,<+>用于新增搜索条件行。
但我希望用户可以选择添加新的搜索条件行,或者添加and分组、or分组,最终实现如下结构:
<and-group|or-group> <->"<field1|field2> <is|is not|contains|doesn't contain> <search term> <->"<+term|+and-group|+or-group>
用户可自行添加条件或分组,最终的搜索条件示例如下:
and-groupcompoundislysineor-grouptissueisbraintissueisspleen
feeding statusis notfasted
对应的过滤查询语句示例如下:
Data.objects.filter(Q(compound="lysine") & (Q(tissue=brain) | Q(tissue="spleen")) & ~Q(feeding_status="fasted"))
注:我不需要请教上述filter表达式的正确写法,目前核心诉求是实现动态层级结构的构建功能。 如果我写的
Q或filter语法有误请见谅,我之前写过这类查询,但刚接触Django不久,凭记忆写对的概率基本为零。为了简化问题,这里我也跳过了跨模型关联的部分,假设所有字段都属于同一个模型。
我暂时不知道怎么为过滤表达式动态加括号,但我现有代码已经可以用and/or拼接单个Q表达式。
我也不清楚如何动态创建支持子分组的层级表单,我猜测这类需求没有成熟的现成方案,需要自行定制实现。
当前已实现功能的截图示例如下:
更新
我参考了相关示例已经推进了很多,在集成到Django项目前已经完成了概念验证:控制台可以输出我需要的完整结构对象,没有报错,点击搜索按钮可以正常做表单校验,留空的字段会弹出填充提示,演示gif见:
现在我需要处理POST输入来构建查询(这部分我可以自行解决),但不知道如何在搜索结果上方还原提交的表单结构,是不是可以在自定义标签中用递归函数实现?或者有没有办法快照表单状态,在下方加载结果时还原表单?也可以考虑让结果加载到单独的frame中吗?
内容的提问来源于stack exchange,提问作者hepcat72

