Администратор Django, фильтр списка на основе логического вызова - PullRequest
4 голосов
/ 06 декабря 2011

На объекте администратора модели у меня есть вызываемая функция, которая возвращает True или False. Я хочу использовать эту функцию для фильтрации того, что отображается в списке (т.е. list_filter). Однако приведенный ниже код не будет работать, потому что вы можете использовать list_filter только для полей:

...

class FooAdmin(admin.ModelAdmin):
    ...
    list_filter['bar']
    def bar(self, obj):
        x = ... #something boolean
        return x
...


Есть ли способ использовать True / False Callable для фильтрации списка в админке? Или вам нужно денормализовать ваши данные, если вы хотите эту функцию?

Я заметил, что в документации по разработке это теперь возможно: https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_filter

Однако в документах 1.3 (я использую версию Django) это не упоминается об этом: https://docs.djangoproject.com/en/1.3/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_filter Поэтому я предполагаю, что не могу использовать новую функциональность в своем проекте: - (

1 Ответ

2 голосов
/ 18 января 2012

Если вы можете каким-либо образом выразить работу вашей bar функции в виде путей поиска с двойным подчеркиванием ORM, то вы сможете создать FilterSpec в Django 1.3

См. django.contrib.admin.filterspecs

Эти классы обрабатывают генерацию списка вариантов фильтров и подготовку значения строки запроса для URL-адреса и т. Д. Насколько я могу судить, они работают, предоставляя атрибут field_path, который другие части кода администратора используют для фильтрации набора запросов списка изменений..

Пример пользовательской FilterSpec см .:
http://djangosnippets.org/snippets/2644/

...