Как в админке python django добавить фильтры с параметрами?

Админка django предлагает создавать свои фильтры с выбором из списка: Скриншот админ панели

Однако, мне необходимо создать фильтр, в который можно будет вписать дополнительный параметр. Пример с сайта onliner: Фильтры с полем ввода

Насколько я знаю, стандартного решения для этого нету. Может быть есть какие-то библиотеки, позволяющие добавлять параметры в фильтры? Потому что альтернатив сортировки, кроме фильтров, в django нету

Built-in фильтры не позволяют это делать, по-этому придется делать свой фильтр.

Наследуемся от SimpleListFilter и переназначаем шаблон:

from django.contrib import admin

class InputFilter(admin.SimpleListFilter):
    template = 'admin/input_filter.html'

    def lookups(self, request, model_admin):
        # Тут нужно просто оставить пустой тапл, чтобы фильтр был на странице.
        return ((),)

В папке templates/admin/ создаем новый файл: input_filter.html.

Его содержимое будет таким:

<h3>{{ filter_title }}</h3>
<ul>
  <li>
    <form method="GET" action="">
        <input
           type="text"
           value="{{ spec.value|default_if_none:'' }}"
           name="{{ spec.parameter_name }}"/>
    </form>
  </li>
</ul>

Дальше мы будем наследоваться от нашего InputFilter:

class ResourceFilter(InputFilter):
    # Тут указываем название нашего поля, по которому будем фильтровать
    parameter_name = 'resource'
    # Тут указываем заголовок фильтра
    title = 'Resource'

    # Переназначаем queryset, если значение есть - фильтруем по нему
    def queryset(self, request, queryset):
        value = self.value()
        if value is not None:
            # **{key: value} - эта конструкция возьмет название поля из класса, сопоставит ему значение и распакует в метод фильтра.
            # Это тоже самое, что мы повторно напишем название поля вот так:
            # return queryset.filter(resource=value)
            return queryset.filter(**{self.parameter_name: value})

Используем свой фильтр вот так:

class UserAdmin(admin.ModelAdmin):
    list_filter = (ResourceFilter,)
    ...
Вернуться на верх