在 Django Admin 中,您可以根据搜索结果限制过滤器选项吗?

问题描述

我有一个包含以下示例模型的 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) 中的值存储在全局变量中,然后在过滤器中使用该变量,但更改列表视图首先进行过滤,然后从搜索功能中提供过滤后的查询集。

对如何实现这一目标有任何建议吗?

示例:

enter image description here

上图中的示例显示了所需的解决方案。在搜索栏中按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)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...