django admin-list_filter内的子查询

问题描述 投票:0回答:1

给出以下型号

class Report(models.Model):
    id = models.CharField(max_length=256, unique=True)
    name = models.CharField(max_length=256)
    confidential = models.BooleanField(default=False)

class Owner(models.Model):
    report = models.ForeignKey(Report, on_delete=models.CASCADE)

以及来自django的以下admin.py

class OwnerAdmin(admin.ModelAdmin):
    .
    .
    .
    list_filter = ('report__name',)

按预期,我可以选择根据报告名称进行过滤。但是,我只想在报告为机密时显示过滤条件,这意味着给定报告的confidential字段为true。我该如何实现?

python django django-admin web-development-server django-admin-filters
1个回答
0
投票

如果我正确理解了您的问题,您只想在list_filter中列出机密报告。为此,您需要创建一个自定义过滤器:

class ReportListFilter(admin.SimpleListFilter):

    title = 'Confidential Reports'
    parameter_name = 'confidential_reports'

    def lookups(self, request, model_admin):
        confidential_reports = model_admin.model.objects.filter(confidential=True)
        return tuple(
            (report.id, report.name) for report in confidential_reports
        )

    def queryset(self, request, queryset):
        return queryset.filter(report__name=self.value())

要了解以上内容,您可以在docs中阅读有关此内容的更多信息,但摘要是:

  • title:为您的过滤器提供标题
  • [parameter_name:给出使用过滤器时将在URL中使用的字符串]
  • [lookups返回一个元组列表,该列表给出过滤器的值
  • queryset是实际的过滤。

然后您只需要将其添加到OwnerAdmin中,一切就可以正常进行:

class OwnerAdmin(admin.ModelAdmin):
    .
    .
    .
    list_filter = (ReportListFilter,)
© www.soinside.com 2019 - 2024. All rights reserved.