InputFilter для Django Admin

Как получить ListFilter с полем ввода вместо списка выбора в Django Admin?

Создаем класс фильтра, унаследовавшись от SimpleListFilter:

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

    def lookups(self, request, model_admin):
        # Dummy, required to show the filter.
        return ((),)

    def choices(self, changelist):
        # Grab only the "all" option.
        all_choice = next(super().choices(changelist))
        all_choice['query_parts'] = (
            (k, v)
            for k, v in changelist.get_filters_params().items()
            if k != self.parameter_name
        )
        yield all_choice

Готовим шаблон admin/input_filter.html для InputFilter:

{% load i18n %}

<h3>{% blocktrans with filter_title=title %} By {{ filter_title }} {% endblocktrans %}</h3>
<ul>
    <li>
        {% with choices.0 as all_choice %}
        <form method="GET" action="">

            {% for k, v in all_choice.query_parts %}
            <input type="hidden" name="{{ k }}" value="{{ v }}" />
            {% endfor %}

            <input  type="text"
                    value="{{ spec.value|default_if_none:'' }}"
                    name="{{ spec.parameter_name }}"/>

            {% if not all_choice.selected %}
                <strong><a href="{{ all_choice.query_string }}">x {% trans 'Remove' %}</a></strong>
            {% endif %}

        </form>
        {% endwith %}
    </li>
</ul>

Наследуемся от InputFilter и создаем пользовательский класс. Предположим, нам нужем фильтр по кодам сайтов, разделенных запятыми.

class SiteIdFilter(InputFilter):
    parameter_name = 'site_id'
    title = 'Коды сайтов'

    def queryset(self, request, queryset):
        value = self.value()
        if value is None:
            return

        try:
            site_ids = [(int(x)) for x in value.split(',')]
        except ValueError:
            return queryset.none()

        return queryset.filter(
            site_id__in=site_ids
        )

Регистрируем новый фильтр в Django Admin:

class TransactionAdmin(admin.ModelAdmin):
    ...
    list_filters = (
        SiteIdFilter,
    )
    ...

Спасибо hakibenita.