Как в админке 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,)
...