Django не поддерживает получение значений внешнего ключа из list_display или list_filter (например, foo__bar). Я знаю, что вы можете создать метод модуля в качестве обходного пути для list_display, но как же я буду делать то же самое для list_filter? Благодарю.Django: list_filter и поля внешнего ключа
ответ
Ну, документы говорят, что вы можете можете использовать 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, как кажется):
Спасибо. Хотя я ищу обходной путь, а не патч. Извините, что не указали это. – Dan
Эта функция больше не работает. Внешние ключевые поля просто не отображаются на боковой панели - это как если бы вы не указали их. –
Если вы создаете URL-адрес списка изменений вручную, то Django не имеет проблем с последующими отношениями. Например:
/admin/contact/contact/?participant__event=8
или
/admin/contact/contact/?participant__event__name__icontains=er
Обе прекрасно работают (хотя последний не добавляет «различны()» так может иметь дубликаты, но это обычно не является проблемой для фильтров)
Вам просто нужно добавить что-то на страницу, которая создает правильные ссылки. Вы можете сделать это либо с помощью переопределения шаблона списка изменений, либо путем написания настраиваемого параметра filterspec. Есть несколько примеров, которые я нашел от Google - особенно на Django Snippets
Я столкнулся с той же проблемой и действительно нуждался в решении. У меня есть обходное решение, позволяющее создать фильтр для свойства модели, связанной с FK. Вы можете даже пересечь более одного отношения FK. Он создает новый подкласс FilterSpec, который подклассифицирует по умолчанию SpecialFilterSpec, который дает вам фильтр в поле ForeignKey.
решения с этой страницы работало для меня 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')
By "('parent')" вы имеете в виду "кортеж ('parent')". Если нет, то удалите скобки. –
Вы можете легко создать пользовательские фильтры с Djang o 1.4 путем переопределения django.contrib.admin.SimpleListFilter
класс.
Дополнительная информация:
Джанго поддерживают 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 также могут охватывать отношения с помощью __ поиск
Это решение, которое сработало для меня, используя Django 1.6. – Pengo
кажется, что Джанго используется для поддержки этой функции до версии 1.2. 4. Я не знаю, почему они отключили его сейчас. –