【问题标题】:Django Admin filter on Foreign Key property外键属性上的 Django Admin 过滤器
【发布时间】:2011-01-23 16:41:28
【问题描述】:

我想通过外键的属性在管理更改列表中添加过滤器,例如

class Address(model.Models):
    street = models.CharField(max_length=25)        
    city = models.CharField(max_length=25)
    country = models.CharField(max_length=25)        

class Customer(models.Model):
    name = models.CharField(max_length=25)
    address = models.ForeignKey(Address)

假设在客户管理更改列表中,我想按城市和国家/地区显示过滤器(因此向我显示特定国家或城市的所有客户)。

但标准的 list_filter() 功能似乎只允许直接在模型上按字段过滤,而不是在其任何外键上过滤。我试过了:

list_filter = ("address__country",)

list_filter = ("address.country",)

但我总是遇到相同类型的错误:

 'address__country' is not a callable or an attribute 

欢迎提出任何建议。是否有一些特殊的命名约定/语法允许过滤 FK 属性?

【问题讨论】:

标签: python django filter admin


【解决方案1】:

https://code.djangoproject.com/ticket/3400。它在 django 1.3 中工作正常 :)

class Room(models.Model):
    house = models.ForeignKey(House)

    def __unicode__(self):
        return self.house.town.name

class Booking(models.Model):
    room = models.ForeignKey(Room)

    def __unicode__(self):
        return self.room.house.town.name

class BookingOpts(admin.ModelAdmin):
    list_filter = ('room__house__town',)
    raw_id_admin = ('room', )

admin.site.register(Town)
admin.site.register(House)
admin.site.register(Room)
admin.site.register(Booking, BookingOpts)

【讨论】:

  • 不错的建议,它在 Django 1.3.3 上运行良好,谢谢。明显的注意:第一个和第二个类转到models.py,最后一个带有注册功能的类转到admin.py。 rooms__house__town 被翻译成 rooms.house.town。
  • 我刚刚为类似问题找到了这个解决方案。如果您的过滤器需要更多功能,请查看扩展 django.contrib.admin.SimpleListFilter 并滚动您自己的过滤器。我只是为我的新项目做的,它比最初看起来要容易得多。
【解决方案2】:

我已经找到并测试了以下解决方案:

http://www.djangosnippets.org/snippets/1911/

它适用于 ForeignKeys,但不适用于 ManyToMany 关系。

【讨论】:

    【解决方案3】:

    我遇到了同样的问题,确实需要一个解决方案。我有一个解决方法,可让您在 FK 相关模型属性上创建过滤器。您甚至可以遍历多个 FK 关系。它创建了一个新的 FilterSpec 子类,该子类将默认的 RelatedFilterSpec 子类化,用于在 ForeignKey 字段上为您提供过滤器。

    http://djangosnippets.org/snippets/2260/

    【讨论】:

      猜你喜欢
      • 2010-12-31
      • 2017-02-04
      • 1970-01-01
      • 2021-09-04
      • 2022-09-26
      • 2012-06-27
      • 2014-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多