这是此线程的后续操作: How to filter ModelAdmin autocomplete_fields results with the context of limit_choices_to
Uberdude提出了一个解决方案,它可以根据触发请求的字段定制autoselect queryset,但我还需要根据客户端的输入进行过滤,最具体的是一个复选框,它不是一个模型字段,并且仅适用于此表单摘录中表单中的一些字段
我通过覆盖AutocompleteSelect小部件将复选框应用于小部件,如下所示:
class AutocompleteSelectCb(AutocompleteSelect):
def render(self, name, value, attrs=None):
s = super().render(name, value, attrs)
return mark_safe('<div style="margin-bottom:10px;"><input type="checkbox" id="parent1"\
name="parentx" value="1">Search among all kennels</div>' + s)
并且仅当字段出现在admin中的autocomplete_cb_fields属性中时才使用该小部件:
autocomplete_fields = ['breed']
autocomplete_cb_fields = ['father', 'mother']
但是,我不知道如何让我的AutocompleteSelectCb小部件发送复选框的状态,以便在get_search_results方法中处理它。我想用一些js,但是怎么做呢?有什么想法吗
我最终能够通过使用thispost中介绍的方法解决这个问题,即向referer URL添加querystring键,因为select2在初始化后不接受对请求URL的修改。 我还添加了关于正在编辑的狗的其他信息,例如它的id和出生年份,以进一步过滤查询集(狗不能是自己的父母或父母比自己小,母亲只能是雌性…)
最后,在服务器端进行过滤是一项挑战,因为狗狗管理员通常由犬舍进行过滤,因此每个犬舍所有者只能编辑他们的狗,尽管复选框允许他们使用其他犬舍的狗作为父母。get_search_results方法中的挑战是在复选框时取消筛选queryset,这是无法完成的,因此在将它传递给super()之前创建一个新的。 此外,base get_search_results方法似乎可以遍历所有关系,即使它们不需要,也会导致100多个查询,因此在所有关系上使用select_related只生成一个查询
相关问题 更多 >
编程相关推荐