Как изменить фильтр администратора Django для использования выпадающего списка вместо списка, по которому также можно осуществлять поиск?

Прежде чем вы пометите это как дубликат, я прочитал решения этого вопроса.

В Django Admin у меня много значений. Команда, которая работает над этими данными, в настоящее время может использовать CTRL+F, чтобы хотя бы найти нужное поле.

Для исправления UI у меня есть опция рендеринга Dropdown, доступная в решении вопроса, помеченного выше. Но, как я уже сказал, мне нужно, чтобы он был доступен для поиска.

Я боролся с той же проблемой несколько недель назад. Так что этот ответ может быть полезен некоторым разработчикам в будущем.

Мне удалось решить проблему, написав пользовательский template.html

. Теперь я собрал код в удивительный пакет, который делает то же самое для вас, вот ссылка .


Вот как можно реализовать выпадающий список с возможностью поиска вместо списка по умолчанию:

1. Установка:

pip install django-admin-searchable-dropdown

Эта команда установит последнюю версию пакета в ваш проект.
Теперь включите пакет в свой проект, добавив admin_searchable_dropdown к вашему INSTALLED_APPS внутри settings.py файла.

2. Использование:
Допустим, у вас есть следующие модели:

from django.db import models

class CarCompany(models.Model):
    name = models.CharField(max_length=128)

class CarModel(models.Model):
    name = models.CharField(max_length=64)
    company = models.ForeignKey(CarCompany, on_delete=models.CASCADE)

И вы хотите отфильтровать результаты в CarModelAdmin на основе company. Вам нужно определить search_fields в CarCompany и затем определить фильтр следующим образом:

from django.contrib import admin
from admin_searchable_dropdown.filters import AutocompleteFilter


class CarCompanyFilter(AutocompleteFilter):
    title = 'Company' # display title
    field_name = 'company' # name of the foreign key field


class CarCompanyAdmin(admin.ModelAdmin):
    search_fields = ['name'] # this is required for django's autocomplete functionality
    # ...


class CarModelAdmin(admin.ModelAdmin):
    list_filter = [CarCompanyFilter]
    # ...

После выполнения этих шагов вы можете увидеть фильтр следующим образом:

  1. Вот как фильтр списка отображается в виде выпадающего списка при использовании пакета
  2. Выпадающий фильтр также доступен для поиска

Предлагаемые функции:

  1. Если у вас большие поля в фильтре администратора, боковая панель расширяется, этот пакет предоставляет вам тот же список в выпадающем формате, следовательно, нет таких хлопот.
  2. Если у вас больше, чем, скажем, 20 элементов поля, фильтр списка становится длинной боковой панелью, просто разрушая интерфейс администратора. Выпадающий фильтр исправляет это.
  3. Выпадающий фильтр также "поисковый", с текстовым полем ввода (которое использует собственную функцию Django auto_complete), так что пока версия Django, которую вы используете, выше 2.0, все будет в порядке.
  4. Вы можете настроить другие list_filters, которые у вас могут быть, например, изменить Заголовок над выпадающим меню, или пользовательскую логику поиска и т.д.
  5. Вы можете настроить тексты виджетов для отображения в опции выпадающего списка, чтобы использовать что-то другое, чем по умолчанию str(obj)
  6. .
Вернуться на верх