2010-05-26 106 views
0

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

class Location(model): 
    name = CharField() 

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

现在我要过滤查询,只显示那些包含涉及具体地点的对象。如果我使用

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

admin.site.register(Inquiry, InqAdmin) 

管理页面显示我的一切Locations的列表,并允许进行筛选。

我想得到的是获得只有那些相对于他们有一些Inquiries位置的列表(所以我没有得到过滤后的空列表结果)。

这怎么办?

回答

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

+0

是,包括告诉你取悦从未过滤掉导致默认经理段:https://docs.djangoproject.com/en/dev/topics/db/managers/#do-not- filter-away-any-results-in-this-type-of-manager-subclass例如,管理页面使用它们,所以你会得到各种奇怪的错误,因为添加/编辑表单不知道其他对象(在这种情况下的位置)。 – bdeniker 2012-08-22 12:08:54