Фильтр Django Admin по свойству внешнего ключа - PullRequest
25 голосов
/ 04 марта 2010

Я хочу добавить фильтр в список изменений администратора по свойству внешнего ключа, например,

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?

Ответы [ 3 ]

20 голосов
/ 21 октября 2011

См. 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)
1 голос
/ 04 марта 2010

Я нашел и протестировал следующее решение:

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

Это работает с ForeignKeys, но не работает с отношениями ManyToMany.

0 голосов
/ 12 ноября 2010

Я столкнулся с той же проблемой и действительно нуждался в решении. У меня есть обходной путь, который позволяет вам создать фильтр для свойства модели, связанной с FK. Вы даже можете пересечь более одного отношения ФК. Он создает новый подкласс FilterSpec, который создает подклассы RelatedFilterSpec по умолчанию, который используется для предоставления фильтра по полю ForeignKey.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...