2010-03-04 175 views
20

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

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属性?

+0

http://stackoverflow.com/questions/2065036/django-list-filter-and-foreign-key-fields – 2010-03-04 14:10:08

回答

0

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

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

18

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) 
+0

不错的建议,它在Django 1.3.3上运行顺利,谢谢。明显的注意事项:第一类和第二类转到models.py,最后一个具有注册功能的转到admin.py。 rooms__house__town被翻译成rooms.house.town。 – chirale 2012-09-05 15:50:56

+1

我刚刚发现类似问题的解决方案。如果您的过滤器需要更多功能,请查看扩展django.contrib.admin.SimpleListFilter并滚动您自己的过滤器。我刚刚为我的新项目做了这个,而且它比首先看起来要容易得多。 – Hovis 2012-11-29 06:17:12