Django не поддерживает получение значений внешнего ключа из list_display или list_filter (например, foo__bar). Я знаю, что вы можете создать метод модуля в качестве обходного пути для list_display, но как же я буду делать то же самое для list_filter? Спасибо.
Django: list_filter и поля внешнего ключа
Ответ 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, как кажется):
Ответ 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')
Ответ 5
Вы можете легко создавать собственные фильтры с Django 1.4, переопределяя класс django.contrib.admin.SimpleListFilter
.
Дополнительная информация:
Ответ 6
Я столкнулся с той же проблемой и действительно нуждался в решении. У меня есть обходное решение, позволяющее создать фильтр для свойства модели, связанной с FK. Вы можете даже пересечь более одного отношения FK. Он создает новый подкласс FilterSpec, который подклассифицирует связанный по умолчанию метод SpecialFilterSpec, который дает вам фильтр в поле ForeignKey.