django admin 如何实现排除搜索

2021-02-04 11:35:06 +08:00
 piaochen0

使用 django admin 的 search_fields 属性,可以实现搜索
但是我现在做的,除了搜索外,还想再增加一个输入框把含有部分文字的项排除掉。
这个有办法实现吗?

目前能想到的是重写
def get_search_results(self, request, queryset, search_term):
方法,不过这个方法里也是能拿到输入框的内容吗?
我的需求是需要再加一个排除搜索的输入框。
不知道有没有什么方法能实现这个需求。或者有其他第三方 admin 能实现这个功能吗?

1833 次点击
所在节点    Django
3 条回复
allisone
2021-02-04 11:59:52 +08:00
我觉得可以再增加一个过滤器,过滤出不包含部分文字的数据,然后再对数据进行搜索即可
Vegetable
2021-02-04 12:04:09 +08:00
如果是一个输入框的话比较简单,比如 输入 [张三 -李四] ,在 get_search_results 中,对 search_term 进行处理,提取出排除条件 [-李四] ,将张三传给 super.get_search_results,查询结果再 queryset.exclude 掉李四就行了。两个框的话,需要自定义组件吧,这个不清楚啦
zonde306
2021-02-04 14:51:54 +08:00
可以,get_search_results 参数 search_term 就是搜索框的内容(类型 str ),对 queryset 参数进行 filter 然后返回即可
排除的话,可以考虑用数据库的全文索引,实现简单,性能尚可

例如
```
def get_search_results(self, request, queryset, search_term):
if not search_term:
return super().get_search_results(request, queryset, search_term)

return queryset.filter(seo__search=search_term), False
#end get_search_results
```

```
class SearchLookup(models.Lookup):
lookup_name = "search"

def as_mysql(self, compiler, connection):
lhs, lhs_params = self.process_lhs(compiler, connection)
rhs, rhs_params = self.process_rhs(compiler, connection)
params = lhs_params + rhs_params
return "MATCH (%s) AGAINST (%s IN BOOLEAN MODE)" % (lhs, rhs), params
#end as_mysql
#end - SearchLookup
```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/751192

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX