Django: list_filter и поля внешнего ключа - PullRequest
16 голосов
/ 14 января 2010

Django не поддерживает получение значений внешнего ключа из list_display или list_filter (например, foo__bar). Я знаю, что вы можете создать метод модуля в качестве обходного пути для list_display, но как мне поступить так же для list_filter? Спасибо.

Ответы [ 6 ]

24 голосов
/ 29 декабря 2013

Django поддерживает list_filter с полями внешнего ключа

# models.py:
class Foo(models.Model):
    name = models.CharField(max_length=255)

    def __unicode__(self):
        return self.name

class Bar(models.Model):
    name = models.CharField(max_length=255)
    foo = models.ForeignKey(Foo)

# admin.py:
class BarAdmin(admin.ModelAdmin):
    list_filter = ('foo__name')

Из документации: имена полей в list_filter могут также охватывать отношения, используя __ lookup

12 голосов
/ 14 января 2010

Ну, в документах сказано, что вы можете использовать ForeignKey типы полей в list_filter:

http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_filter

Пример:

# models.py:
class Foo(models.Model):
    name = models.CharField(max_length=255)

    def __unicode__(self):
        return self.name

class Bar(models.Model):
    name = models.CharField(max_length=255)
    foo = models.ForeignKey(Foo)

# admin.py:
class BarAdmin(admin.ModelAdmin):
    list_filter = ('foo')

Если вы хотите отфильтровать по полю из связанной модели, на этом пути есть исправление (вероятно, будет объединено в 1.2, как кажется):

http://code.djangoproject.com/ticket/3400

3 голосов
/ 13 марта 2011

решение с этой страницы у меня сработало http://www.hoboes.com/Mimsy/hacks/fixing-django-124s-suspiciousoperation-filtering/

определить

class SmarterModelAdmin(admin.ModelAdmin):
    valid_lookups = ()
    def lookup_allowed(self, lookup, *args, **kwargs):
        if lookup.startswith(self.valid_lookups):
            return True
         return super(SmarterModelAdmin, self).lookup_allowed(lookup, *args, **kwargs)

затем разрешите поиск для определенного поля внешнего ключа

class PageAdmin(SmarterModelAdmin):
   valid_lookups = ('parent')
2 голосов
/ 05 октября 2012

Вы можете легко создавать пользовательские фильтры начиная с Django 1.4, переопределив django.contrib.admin.SimpleListFilter class.

Дополнительная информация:

  1. Документация администратора списка_фильтров ;
  2. Замечание к выпуску Django-1.4 .
2 голосов
/ 22 января 2010

Если вы создадите URL для списка изменений вручную, то у Django не возникнет проблем с установлением отношений. Например:

/admin/contact/contact/?participant__event=8

или

/admin/contact/contact/?participant__event__name__icontains=er

Оба работают нормально (хотя последний не добавляет 'different ()', поэтому может иметь дубликаты, но обычно это не проблема для фильтров)

Так что вам просто нужно добавить что-то на страницу, которая создает правильные ссылки. Вы можете сделать это либо путем переопределения шаблона списка изменений, либо путем написания пользовательской спецификации фильтра. Есть несколько примеров, которые я нашел в Google, особенно на Django Snippets

1 голос
/ 12 ноября 2010

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

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

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