Сегодня мы углубимся в две ключевые возможности 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') # Добавляем фильтры
Когда вы зайдёте в админ-зону, то увидите, что в правой части экрана теперь есть фильтры. Вы можете выбрать:
- Посты по статусу (Draft или Published);
- Посты за определённый год или месяц.
Фильтры по связанным моделям
Если у модели есть внешние ключи (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')
Теперь фильтр покажет всех авторов, и вы сможете быстро найти посты конкретного автора.
Дополнительные фишки фильтров
Фильтры по диапазонам дат: Django автоматически добавляет фильтры по годам и месяцам для полей типа
DateFieldилиDateTimeField. Вам не нужно ничего дополнительно настраивать.Кастомные фильтры: если встроенных фильтров недостаточно, можно создать свои собственные классы фильтров, унаследовав их от
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')
Обратите внимание на синтаксис: для поиска по связанным полям используйте двойное подчёркивание __.
Важные моменты и ограничения
Полнотекстовый поиск: если ваше приложение требует поиска по всему содержимому записей (например, поисковая строка на сайте), встроенного поиска Django Admin может быть недостаточно. В таких случаях лучше использовать решения вроде Elasticsearch.
Производительность: поиск в больших таблицах может быть медленным. Убедитесь, что вы добавили индексы на поля, которые указываете в
search_fields.Поддерживаемые типы полей: поиск работает только с текстовыми и числовыми полями. Для других типов данных (например, даты или логические значения) поиск не сработает.
Практическое задание
- Создайте модель
Product(товар), которая содержит следующие поля:- Название
name, - Категория
category, - Цена
price.
- Название
- Зарегистрируйте модель в админ-зоне.
- Добавьте фильтры: по категории и по цене.
- Настройте поиск по названию товара и категории.
Подсказка: поле цены можно фильтровать с помощью диапазонов. Для этого придётся реализовать кастомные фильтры (но это уже дополнительное задание для тех, кто хочет больше практики).
Теперь вы знаете, как настроить фильтры и поиск, чтобы админ-зона вашего проекта стала удобным инструментом для работы с большими объёмами данных. Эти навыки пригодятся вам во многих реальных проектах, особенно когда клиент захочет, чтобы "всё работало, как в Excel, но лучше".
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ