Сьогодні ми заглибимося у дві ключові можливості Django Admin: фільтри та пошук. Ці інструменти дозволяють адміністраторам швидко знаходити потрібні дані серед можливого хаосу записів і таблиць.
Уявіть, що у вас у базі даних зберігається список користувачів. Їх, припустимо, 10 тисяч. Керівник просить вас знайти всіх користувачів, які зареєструвалися за останні три дні, або тих, у кого ім'я починається з літери "А". І тут ви розумієте, що без інструментів навігації ваше життя перетвориться на мучливий SQL-запит ручної роботи.
Фільтри та пошук в адмін-зоні дозволяють вирішувати такі задачі за лічені секунди. Вони роблять управління даними на диво зручним.
Фільтри в Django Admin
Фільтри дозволяють додавати зручні бокові панелі на сторінках списку об'єктів. Ці панелі допомагають користувачеві "фільтрувати" записи за певними критеріями, такими як дати, категорії, статуси і так далі.
Фільтри додаються через атрибут list_filter у вашому класі ModelAdmin. Давайте розберемо приклад.
Уявімо, що ми створюємо адмін-зону для моделі Post, яка описує статті блогу. Кожна стаття має наступні поля:
- Заголовок,
- Статус публікації (чернетка або опублікована),
- Дата публікації.
Модель у models.py:
from django.db import models
class Post(models.Model):
STATUS_CHOICES = [
('draft', 'Чернетка'),
('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') # Додаємо фільтри
Коли ви зайдете в адмін-зону, то побачите, що у правій частині екрану тепер є фільтри. Ви можете вибрати:
- Пости за статусом (Чернетка або Опублікована);
- Пости за певний рік або місяць.
Фільтри за пов'язаними моделями
Якщо у моделі є зовнішні ключі (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, але краще".
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ