JavaRush /Курси /Модуль 3: Django /Кастомізація відображення моделей

Кастомізація відображення моделей

Модуль 3: Django
Рівень 11 , Лекція 2
Відкрита

На попередніх заняттях ми познайомилися з Django Admin і навчилися реєструвати моделі. Ми також розібралися, як реєструвати моделі за допомогою admin.site.register() — це було дійсно просто, чи не так? Нарешті, ви дізналися, як підключити базову модель без налаштування, а потім почали освоювати розширену кастомізацію з використанням класу ModelAdmin.

Сьогодні ми зробимо ще один крок вперед і почнемо прокачувати відображення наших моделей у Django Admin. Готуйтесь: ми будемо змінювати список полів, додавати фільтри та шукати дані прямо у панелі адміністратора. Повний контроль над відображенням даних — ось наша мета.

Зміна списку полів для відображення

Як тільки ти зазирнув в адмін-зону, міг помітити стандартний список об'єктів. Але базове відображення — надто нудне і взагалі "не айс". Що, якщо ми хочемо більше деталей? Наприклад, ми хочемо бачити конкретні поля, а не просто назви об'єктів. Знайомся, атрибут list_display.

Наведемо приклад. Припустимо, у нас є наступна модель:

# models.py
from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.CharField(max_length=200)
    publication_year = models.IntegerField()
    genre = models.CharField(max_length=100)

    def __str__(self):
        return self.title

І ми вже зареєстрували її в адмінці:

# admin.py
from django.contrib import admin
from .models import Book

admin.site.register(Book)

Тепер ми хочемо відображати поля title, author і publication_year на сторінці списку об'єктів. Для цього створимо клас ModelAdmin і налаштуємо list_display:

# admin.py
from django.contrib import admin
from .models import Book

class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'author', 'publication_year')

admin.site.register(Book, BookAdmin)

Після оновлення сторінки ти побачиш, що таблиця в адмінці показує три колонки: "Title", "Author" і "Publication Year". Краса ж, правда?

Якщо ти забув про list_display, адмінка за замовчуванням буде використовувати тільки __str__() для відображення об'єктів. Звернення до list_display дозволяє додати більше деталей.

Додавання фільтрів

Коли у вас багато даних, знайти щось конкретне вручну — це біль. Справжній біль. Як ви думаєте, що робить адмінка в цьому випадку? Звісно ж, додає фільтри! Для цього ми використовуємо атрибут list_filter.

Повернемося до нашої моделі Book. Припустимо, ми хочемо фільтрувати книги в адмінці за жанром і роком публікації. Налаштуємо фільтри:

# admin.py
class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'author', 'publication_year')
    list_filter = ('genre', 'publication_year')

admin.site.register(Book, BookAdmin)

Тепер у правій частині інтерфейсу адмінки з'явиться панель фільтрів. Ви можете вибирати книги за жанрами та роками публікації. Вуаля! І ніяких SQL-запитів вручну — Django зробить за нас всю важку роботу.

Додавання функції пошуку

Ви коли-небудь пробували шукати голку в копиці сіна? Приблизно так само працюють таблиці без пошуку. Але не хвилюйтесь: адмінка знову наготові! Для пошуку даних використовується атрибут search_fields.

Зауваження:

Пошук працює через SQL-запити і підтримує пошук по текстових полях, таких як CharField, TextField і т.д.

Додамо можливість пошуку книг за назвою та автором:

# admin.py
class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'author', 'publication_year')
    list_filter = ('genre', 'publication_year')
    search_fields = ('title', 'author')

admin.site.register(Book, BookAdmin)

На сторінці списку об'єктів з'явиться рядок пошуку. Введіть, наприклад, «Діккенс», і всі книги автора одразу з'являться на екрані.

Кастомізація методів відображення

Ось ми й дійшли до творчого етапу! Замість стандартного відображення полів, ми можемо додати форматування, виконати обчислення або показати щось незвичайне. Для цього використовуються кастомні методи.

Припустимо, ми хочемо додати колонку, яка показує, коли книга була видана — понад 50 років тому чи ні. Створимо для цього спеціальний метод:

# admin.py
from datetime import datetime

class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'author', 'publication_year', 'is_vintage')

    def is_vintage(self, obj):
        # Перевіряємо, чи видана книга понад 50 років тому
        return datetime.now().year - obj.publication_year > 50
    is_vintage.short_description = 'Вінтажне видання'  # Назва колонки
    is_vintage.boolean = True  # Відображати як галочку

admin.site.register(Book, BookAdmin)

Порядок об'єктів у списку

Ви коли-небудь замислювалися: "Чому мої дані показуються у випадковому порядку?" Причина проста: SQL не сортує дані автоматично. В адмінці Django це легко виправити за допомогою атрибута ordering.

Припустимо, ми хочемо, щоб книги розташовувалися від нових до старих (за роком публікації):

# admin.py
class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'author', 'publication_year')
    list_filter = ('genre', 'publication_year')
    search_fields = ('title', 'author')
    ordering = ('-publication_year',)  # Знак мінуса означає сортування за спаданням

admin.site.register(Book, BookAdmin)

Тепер найновіші книги завжди будуть відображатися першими у списку. Просто і зручно!

Поля тільки для читання

Іноді ми не хочемо, щоб користувачі могли змінювати певні поля. Наприклад, дату створення запису. Для цього використовується атрибут readonly_fields.

Додамо поле created_at в модель Book, зробимо його тільки для читання:

# models.py
class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.CharField(max_length=200)
    publication_year = models.IntegerField()
    genre = models.CharField(max_length=100)
    created_at = models.DateTimeField(auto_now_add=True)  # Додано поле

    def __str__(self):
        return self.title
# admin.py
class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'author', 'publication_year', 'created_at')
    readonly_fields = ('created_at',)

admin.site.register(Book, BookAdmin)

Тепер ви зможете бачити значення поля created_at, але не зможете його змінювати. Це захистить вашу базу від випадкових помилок.

Підводні камені та корисні поради

Робота з відображенням моделей в адмінці здається простою, але є кілька нюансів.

По-перше, уникайте перевантаження списку колонок у list_display. Намагайтеся залишати лише поля, які дійсно потрібні. В іншому випадку таблиця стане незручною для перегляду.

По-друге, будьте обережні з великими обсягами даних. Якщо у вас мільйони записів, використання фільтрів і пошуку може сповільнити адмінку. У таких випадках подумайте про оптимізацію запитів, наприклад, через індекси у базі даних.

Тепер ви знаєте, як кастомізувати відображення моделей у Django Admin. Ми навчилися додавати колонки, фільтри, пошук і кастомні методи, а також обмежувати доступ до редагування. У наступному уроці ми розберемо ModelAdmin глибше і навчимося ще крутішим трюкам. 🚀

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ