Подтвердить что ты не робот

Django: list_filter и поля внешнего ключа

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

4b9b3361

Ответ 1

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

Ответ 2

Хорошо, документы говорят, что вы можете использовать типы полей 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

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

/admin/contact/contact/?participant__event=8

или

/admin/contact/contact/?participant__event__name__icontains=er

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

Поэтому вам просто нужно добавить что-то на страницу, которая создает правильные ссылки. Вы можете сделать это либо с помощью переопределения шаблона списка изменений, либо путем написания настраиваемого параметра filterspec. Есть несколько примеров, которые я нашел в Googling - особенно на Django Snippets

Ответ 4

решение с этой страницы работало для меня 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')

Ответ 6

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

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