Как добавить поле поиска на главную страницу админки?

Добавление поля поиска на главную страницу админки Django может осуществляться с помощью кастомизации шаблона или путем создания собственной административной панели. В данном ответе я расскажу о первом подходе, который является более простым и быстрым.

1. Создание кастомного шаблона для админки:
- В папке вашего проекта создайте папку с именем "templates".
- Внутри папки "templates" создайте папку "admin".
- В папке "admin" создайте файл "base_site.html".
- Откройте файл "base_site.html" и вставьте следующий код:

        {% extends "admin/base.html" %}

        {% block content %}
          {{ block.super }}
          <div id="content-search">
            <h2>Search</h2>
            <form method="get" action="" id="searchbar">
              <input type="text" name="q" placeholder="Search" value="{{ query }}"/>
              <input type="submit" value="Search" class="search-button"/>
            </form>
          </div>
        {% endblock %}

2. Настройка пути к вашему кастомному шаблону:
- В файле "settings.py" вашего проекта найдите переменную "TEMPLATES".
- Внутри списка настройте 'APP_DIRS': True, чтобы Django мог обнаружить шаблоны внутри приложений.

3. Обновление URL-паттернов:
- В файле "urls.py" вашего проекта найдите переменную "urlpatterns".
- Импортируйте класс "AdminSite" из модуля "django.contrib.admin".
- Создайте экземпляр класса "AdminSite".
- Замените строку, в которой создается объект "admin.site", на создание вашего собственного экземпляра "AdminSite".

        from django.urls import path
        from django.contrib import admin
        from django.contrib.admin import AdminSite

        class CustomAdminSite(AdminSite):
            site_header = 'My Custom Admin'

        admin.site = CustomAdminSite(name='customadmin')

        urlpatterns = [
            path('admin/', admin.site.urls),
        ]

4. Обновление настроек админки:
- В файле "admin.py" вашего приложения импортируйте класс "ModelAdmin" из модуля "django.contrib.admin".
- Определите свой класс-наследник от "ModelAdmin".
- Добавьте в класс-наследник метод "get_search_results", который будет осуществлять поиск на основе введенной пользователем строки.

        from django.contrib import admin
        from django.contrib.admin import ModelAdmin

        class CustomModelAdmin(ModelAdmin):
            def get_search_results(self, request, queryset, search_term):
                search_fields = self.get_search_fields(request)
                if search_term:
                    queryset = queryset.filter(**{
                        '{}__icontains'.format(search_field): search_term,
                    })
                return queryset, False

        admin.site.register(YourModel, CustomModelAdmin)

Обратите внимание, что "YourModel" должно быть заменено на имя вашей модели.

5. Перезапустите ваш сервер и проверьте работу поисковой строки на главной странице админки.

В результате выполнения всех вышеописанных действий, вы должны увидеть поле поиска с кнопкой на главной странице админки, которые позволят вам искать записи в вашей модели.