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', 'Чернетка'),
        ('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. Пости за статусом (Чернетка або Опублікована);
  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, але краще".

3
Опитування
Вступ до Django Admin, рівень 11, лекція 4
Недоступний
Вступ до Django Admin
Вступ до Django Admin
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ