问题描述
我有一个包含以下示例模型的 Django 应用程序:
class Artist(models.Model):
name = models.CharField(max_length=200)
class Album(models.Model):
name = models.CharField(max_length=200)
...
num_stars = models.IntegerField()
artist = models.ForeignKey(Artist,on_delete=models.CASCADE)
我有一个 Album_Admin(admin.ModelAdmin)
,我想将搜索和过滤结合起来。我正在使用 admin.SimpleListFilter
字段上的 num_stars
编写自定义过滤器。
我希望 num_stars
的过滤器选择能够反映搜索结果中的可能选择。我不想看到表格中存在的所有可用过滤器选项,只想看到搜索结果中存在的那些。
我尝试将搜索字段 (search_term) 中的值存储在全局变量中,然后在过滤器中使用该变量,但更改列表视图首先进行过滤,然后从搜索功能中提供过滤后的查询集。
对如何实现这一目标有任何建议吗?
上图中的示例显示了所需的解决方案。在搜索栏中按artist_id = 1搜索后,我只想查看为artist_id = 1(**和****)的专辑设置的过滤选项
解决方法
是的,你可以。请求在过滤器类中可用。
例如,我刚刚在 admin 中搜索了我的名字,它给了我以下 URL;
/admin/authentication/user/?q=mark
因此您的过滤器类可以从请求中获取查询;
class FilterQuery(admin.SimpleListFilter):
"""
List filter to filter alongside the search query
"""
title = 'search query filter'
def __init__(self,request,params,model,model_admin):
super().__init__(request,model_admin)
self.search_query = request.GET.get('q')
def queryset(self,queryset):
"""
Perform the filtering (if required)
"""
return queryset.filter(name__icontains=self.search_query)