django admin过滤器调整

时间:2010-05-26 10:55:16

标签: django django-admin filtering

我想在列表页面上使用django的管理过滤器。  我的模型是这样的:

class Location(model):
  name = CharField()

class Inquiry(Model):
  name = CharFiled()
  location = ManyToManyField(Location)

现在我想过滤查询,只显示包含特定Location对象关系的那些。如果我使用

class InqAdmin(ModelAdmin):
  list_filter = ['location', ]

admin.site.register(Inquiry, InqAdmin)

管理页面会显示所有Locations的列表并允许过滤。

我想得到的是,只获取那些与它们有一些Inquiries的位置的列表(因此我不会在过滤后获得空列表结果)。

如何做到这一点?

1 个答案:

答案 0 :(得分:1)

您可以为位置创建自定义管理器,该管理器仅返回具有与之关联的查询的位置。如果您将其设为默认管理员,则管理员将使用它。

唯一需要注意的是,您需要创建另一个经理,该经理会返回所有位置,并在您想要检索没有关联查询的位置时在应用的其余部分使用该位置。

The managers section in the Django docs非常好,应该只需要设置它就可以了。

修改

sienf提出了一个很好的观点。另一种实现此目的的方法是定义django.contrib.admin.SimpleListFilter的子类,并编写queryset方法以过滤掉具有空位置的查询。见https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_filter