【问题标题】:django admin filter tweakingdjango 管理过滤器调整
【发布时间】:2011-02-24 03:06:31
【问题描述】:

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

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 的位置的列表(所以我在过滤后永远不会得到空列表结果)。

如何做到这一点?

【问题讨论】:

    标签: django django-admin filtering


    【解决方案1】:

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

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

    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

    【讨论】:

    • 是的,包括告诉您不要过滤掉默认管理器中的结果的部分:docs.djangoproject.com/en/dev/topics/db/managers/… 首先,管理页面使用它们,因此您会遇到各种奇怪的错误,因为添加/编辑表单不知道其他对象(在这种情况下为位置)。
    猜你喜欢
    • 2013-07-26
    • 2020-09-15
    • 2011-11-09
    • 2021-01-01
    • 2011-11-13
    • 2011-03-05
    • 2011-01-23
    • 2020-11-02
    • 1970-01-01
    相关资源
    最近更新 更多