给出以下型号
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。我该如何实现?
如果我正确理解了您的问题,您只想在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,)