2010-01-14 1 views
14

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

+1

кажется, что Джанго используется для поддержки этой функции до версии 1.2. 4. Я не знаю, почему они отключили его сейчас. –

ответ

11

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

+1

Спасибо. Хотя я ищу обходной путь, а не патч. Извините, что не указали это. – Dan

+5

Эта функция больше не работает. Внешние ключевые поля просто не отображаются на боковой панели - это как если бы вы не указали их. –

2

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

/admin/contact/contact/?participant__event=8 

или

/admin/contact/contact/?participant__event__name__icontains=er 

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

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

1

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

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

3

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

By "('parent')" вы имеете в виду "кортеж ('parent')". Если нет, то удалите скобки. –

18

Джанго поддерживают 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 также могут охватывать отношения с помощью __ поиск

+0

Это решение, которое сработало для меня, используя Django 1.6. – Pengo