JavaRush /Курсы /Модуль 3: Django /Фильтры и поиск в админ-зоне

Фильтры и поиск в админ-зоне

Модуль 3: Django
11 уровень , 4 лекция
Открыта

Сегодня мы углубимся в две ключевые возможности Django Admin: фильтры и поиск. Эти инструменты позволяют администраторам быстро находить нужные данные среди возможного хаоса записей и таблиц.

Представьте, что у вас в базе данных хранится список пользователей. Их, допустим, 10 тысяч. Руководитель просит вас найти всех пользователей, зарегистрировавшихся за последние три дня, или тех, у кого имя начинается с буквы "А". И тут вы понимаете, что без инструментов навигации ваша жизнь превратится в мучительный SQL-запрос ручной работы.

Фильтры и поиск в админ-зоне позволяют решать такие задачи за считанные секунды. Они делают управление данными на удивление удобным.

Фильтры в Django Admin

Фильтры позволяют добавлять удобные боковые панели на страницах списка объектов. Эти панели помогают пользователю "фильтровать" записи по определённым критериям, таким как даты, категории, статусы и так далее.

Фильтры добавляются через атрибут list_filter в вашем классе ModelAdmin. Давайте разберём пример.

Представим, что мы создаём админ-зону для модели Post, которая описывает статьи блога. Каждая статья имеет следующие поля:

  • Заголовок,
  • Статус публикации (черновик или опубликована),
  • Дата публикации.

Модель в models.py:

from django.db import models

class Post(models.Model):
    STATUS_CHOICES = [
        ('draft', 'Draft'),
        ('published', 'Published'),
    ]

    title = models.CharField(max_length=100)
    status = models.CharField(max_length=10, choices=STATUS_CHOICES)
    published_date = models.DateField()

    def __str__(self):
        return self.title

Теперь мы хотим добавить фильтры в админ-зоне, чтобы можно было быстро находить:

  • Посты по статусу status,
  • Посты по дате публикации published_date.

Добавим фильтры в admin.py:

from django.contrib import admin
from .models import Post

@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    list_display = ('title', 'status', 'published_date')
    list_filter = ('status', 'published_date')  # Добавляем фильтры

Когда вы зайдёте в админ-зону, то увидите, что в правой части экрана теперь есть фильтры. Вы можете выбрать:

  1. Посты по статусу (Draft или Published);
  2. Посты за определённый год или месяц.

Фильтры по связанным моделям

Если у модели есть внешние ключи (ForeignKey), вы также можете добавить фильтры по связанным объектам.

Пример:

Представим, что у каждого поста есть автор:

class Author(models.Model):
    name = models.CharField(max_length=100)

class Post(models.Model):
    # Остальные поля...
    author = models.ForeignKey(Author, on_delete=models.CASCADE)

И в PostAdmin:

class PostAdmin(admin.ModelAdmin):
    list_filter = ('author', 'status', 'published_date')

Теперь фильтр покажет всех авторов, и вы сможете быстро найти посты конкретного автора.

Дополнительные фишки фильтров

  1. Фильтры по диапазонам дат: Django автоматически добавляет фильтры по годам и месяцам для полей типа DateField или DateTimeField. Вам не нужно ничего дополнительно настраивать.

  2. Кастомные фильтры: если встроенных фильтров недостаточно, можно создать свои собственные классы фильтров, унаследовав их от SimpleListFilter. Это продвинутая тема, и мы к ней вернёмся позже.

Поиск в Django Admin

Поиск помогает находить записи по текстовым и числовым полям в админ-зоне. Вы можете указать, по каким именно полям искать, через атрибут search_fields.

Добавим функциональность поиска для модели Post. Мы хотим, чтобы поиск выполнялся по следующим полям:

  • - Заголовок title,
  • - Статус status.

Настройка в admin.py:

class PostAdmin(admin.ModelAdmin):
    list_display = ('title', 'status', 'published_date')
    list_filter = ('status', 'published_date')
    search_fields = ('title', 'status')  # Добавляем поиск по полям

Теперь вверху страницы списка объектов появится строка поиска. Вы можете вбить в неё, например, "Draft", и получите все посты со статусом черновика.

Поиск по связанным моделям

Магия Django Admin позволяет искать не только по текущей модели, но и по связанным объектам.

Пример: если у Post есть автор (связь через ForeignKey), то вы можете искать посты по имени автора.

search_fields = ('title', 'author__name')

Обратите внимание на синтаксис: для поиска по связанным полям используйте двойное подчёркивание __.

Важные моменты и ограничения

  1. Полнотекстовый поиск: если ваше приложение требует поиска по всему содержимому записей (например, поисковая строка на сайте), встроенного поиска Django Admin может быть недостаточно. В таких случаях лучше использовать решения вроде Elasticsearch.

  2. Производительность: поиск в больших таблицах может быть медленным. Убедитесь, что вы добавили индексы на поля, которые указываете в search_fields.

  3. Поддерживаемые типы полей: поиск работает только с текстовыми и числовыми полями. Для других типов данных (например, даты или логические значения) поиск не сработает.

Практическое задание

  1. Создайте модель Product (товар), которая содержит следующие поля:
    • Название name,
    • Категория category,
    • Цена price.
  2. Зарегистрируйте модель в админ-зоне.
  3. Добавьте фильтры: по категории и по цене.
  4. Настройте поиск по названию товара и категории.

Подсказка: поле цены можно фильтровать с помощью диапазонов. Для этого придётся реализовать кастомные фильтры (но это уже дополнительное задание для тех, кто хочет больше практики).

Теперь вы знаете, как настроить фильтры и поиск, чтобы админ-зона вашего проекта стала удобным инструментом для работы с большими объёмами данных. Эти навыки пригодятся вам во многих реальных проектах, особенно когда клиент захочет, чтобы "всё работало, как в Excel, но лучше".

1
Задача
Модуль 3: Django, 11 уровень, 4 лекция
Недоступна
Настройка фильтров по полям модели
Настройка фильтров по полям модели
1
Задача
Модуль 3: Django, 11 уровень, 4 лекция
Недоступна
Добавление поиска в админ-зоне
Добавление поиска в админ-зоне
3
Опрос
Введение в Django Admin, 11 уровень, 4 лекция
Недоступен
Введение в Django Admin
Введение в Django Admin
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ