我有一个页面,我向用户显示查询集的结果。 我想做的是允许用户点击链接以应用过滤器。
目前我所做的是让链接将“get”参数传递给页面以便应用过滤器。过滤器可以是对其他模型或自定义过滤器的引用(例如未分配的过滤器)
为了提供体面的用户体验,实现需要做一些事情
我认为这必须是足够普遍的,除了视图和模板中明显的if / else语句之外,某人必须拥有类似于设计模式或最佳实践的方法。
有吗?
答案 0 :(得分:1)
我发现Django管理员处理这种功能的方式很棒。如果您不熟悉,请查看管理员中的list_filter
选项。它与你所描述的相似,但你的更通用。也许这会帮助你思考一些想法?
首先,对于实际的查询字符串块,您只需传递Django-ORM查找键和值对。例如,?sites__id__exact=1
,tags__in=words
等。由于您希望允许跨模型查找,您需要在字符串中提供另一个部分以包含模型名称,而不是太难。
要检查过滤器是否有效,您只需确保模型/字段查找有效。通过拆分每个QS块的各个部分,您可以识别模型,字段名,查找和值。然后,使用Django的内置功能来验证模型上是否存在fieldname。你也可以使用ForeignKey来做到这一点。 Here's how Django does it
您可以很容易地为此添加过滤器。您将提供您的视图以及使用某些上下文显示这些过滤器的表单,因此它将保留并重新填充给用户。此外,您可以轻松地持久查询字符串。基本上,您在这里始终具有相同的读取/解析功能,没有什么不同。
我认为关键是自动化并尽可能保持DRY。不要屈服于一堆if语句。将这些查找安全地传递到ORM中非常容易,并且很容易捕获错误的查找并向用户提供有意义的错误消息。
我希望能帮助你走上正轨! :)