Модуль 15

Admin-панель Django

Ось готовий урок, згенерований за твоїм майстер-промптом.


🎓 Тема уроку: Admin-панель Django (або як зекономити тиждень роботи за 5 хвилин)

Привіт, друзі! Радий бачити вас знову.

Давайте почнемо з простого запитання. Підніміть руку (або просто кивніть монітору), хто з вас любить писати рутинний код? Ну, знаєте, створювати форми для вводу даних, писати HTML для табличок, налаштовувати валідацію полів, кнопки «Редагувати» та «Видалити»...

Ніхто? Я так і думав.

1. 🔥 Вступ: проблема та мотивація

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

Вашому замовнику (власнику магазину) абсолютно байдуже до SQL. Він не буде відкривати термінал і писати: INSERT INTO products (name, price) VALUES ('iPhone 15', 999);

Йому потрібен зручний інтерфейс: кнопочки, поля, де можна завантажити картинку, галочки «В наявності».

Що б ви робили без Django? Ви б витратили щонайменше тиждень, створюючи окрему частину сайту «для менеджерів». Ви б верстали форми, писали логіку обробки POST-запитів, перевіряли паролі адміністраторів... Це нудно. Це довго. Це дорого.

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

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


2. 🧠 Теоретична база (без сухої академічності)

Отже, що таке Django Admin "під капотом"?

Це не магія, хоча виглядає саме так. Це звичайний Django-застосунок (django.contrib.admin), який вже встановлений у вашому проєкті за замовчуванням.

Як це працює?

  1. Django сканує ваш файл models.py. Він бачить: "Ага, тут є поле Integer, значить, мені треба намалювати поле, куди можна вводити тільки цифри".
  2. Він бачить поле ImageField і автоматично створює кнопку "Завантажити файл".
  3. Він бачить зв'язок ForeignKey і створює випадаючий список.

Що треба запам’ятати залізно: * Адмінка — це CMS (Content Management System) для персоналу сайту, а не для звичайних відвідувачів. * Щоб потрапити туди, потрібен користувач зі статусом is_staff або is_superuser. * Файл управління адмінкою — admin.py (знаходиться в папці вашого додатку).

Інтуїтивне розуміння: Адмінка — це дзеркало вашої бази даних. Якщо ви змінили щось у базі (у моделях), адмінка підлаштується автоматично. Вам не треба переписувати HTML.


3. 🧪 Приклади (від простого до реального)

Припустімо, у нас є модель Product у файлі models.py:

class Product(models.Model):
    title = models.CharField(max_length=200)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    is_active = models.BooleanField(default=True)

    def __str__(self):
        return self.title

Рівень 1: Мінімальний (щоб просто запрацювало)

Відкриваємо admin.py і пишемо:

from django.contrib import admin
from .models import Product

admin.site.register(Product)

Питання до вас: Що ми побачимо, коли зайдемо в адмінку? Ми побачимо список товарів. Але він виглядатиме просто як список назв (завдяки методу __str__). Щоб змінити ціну, треба клікати на кожен товар окремо. Не дуже зручно, якщо у вас 1000 товарів, правда?

Рівень 2: Реальний проєкт (як роблять профі)

Давайте зробимо таблицю інформативною. Ми хочемо бачити ціну одразу в списку і мати можливість шукати товар за назвою.

Ми використовуємо декоратор (це як красива обгортка для нашої моделі):

@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
    list_display = ('title', 'price', 'is_active')  # Які стовпці показувати
    search_fields = ('title',)                      # Пошук за назвою
    list_filter = ('is_active',)                    # Фільтр збоку (Активні/Неактивні)

Чому результат такий? Тепер Django малює повноцінну таблицю. list_display перетворює поля моделі на стовпці таблиці. list_filter додає бічну панель. Ви економите години роботи менеджера, який буде з цим працювати.

Рівень 3: "Магія" (редагування на льоту)

А що, якщо менеджеру треба швидко змінити ціни на 50 товарів? Заходити в кожен — це пекло. Додамо list_editable.

@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
    list_display = ('title', 'price', 'is_active')
    list_editable = ('price', 'is_active') # <-- Дозволяємо редагувати прямо в списку!

Тепер список товарів перетворюється на Excel-таблицю прямо в браузері. Змінив цифри, натиснув "Зберегти" — готово.


4. 🛠 Практична частина

Час забруднити руки кодом! Відкривайте IDE.

Завдання 1: Створення Бога (Superuser) Ви не потрапите в адмінку без перепустки. У терміналі: python manage.py createsuperuser Придумайте логін і пароль (пароль не буде відображатись при введенні — це нормально, це безпека!). Зайдіть за адресою /admin/.

Завдання 2: "Hello World" в адмінці Зареєструйте будь-яку вашу модель через admin.site.register(). Переконайтеся, що вона з'явилася в панелі. Створіть через адмінку 2-3 записи.

Завдання 3: Робимо красиво Перепишіть реєстрацію, використовуючи клас ModelAdmin (як у прикладі 2). * Виведіть мінімум 3 поля в list_display. * Додайте пошук.

Завдання 4: Міні-кейс Уявіть, що у товару є поле created_at (дата створення). * Зробіть так, щоб це поле було тільки для читання (readonly_fields). Адже ми не можемо змінити минуле, коли товар був створений, вірно?

Завдання 5: А що, якщо... Спробуйте додати в list_display поле, якого немає в базі даних. Наприклад, ви хочете вивести "Ціна з податком" (ціна * 1.2). Підказка: Це робиться шляхом створення методу всередині класу ProductAdmin.


5. 💡 Мислення як у розробника

Як відрізнити новачка від сеньйора, дивлячись на admin.py?

Типові помилки новачка: 1. "Admin Object (1), Admin Object (2)": Забувають додати метод __str__ у моделі. У підсумку в адмінці список безіменних об'єктів. 2. Зайвий доступ: Дають доступ до адмінки звичайним клієнтам. Пам'ятайте: адмінка — це "бекенд офісу", а не кабінет користувача. 3. Перевантаження: Намагаються переписати адмінку так сильно, що вона перетворюється на кастомний сайт. Якщо вам треба дуже складна логіка — краще напишіть власні views. Не ґвалтуйте адмінку.

Порада з практики (Security): У реальному житті ніколи не залишайте адресу /admin/ стандартною. Хакери сканують її першою. Змініть її в urls.py на щось на кшталт /super-secret-control-panel/.

Як думає профі: "Я використовую адмінку, щоб швидко протестувати свої моделі та дати замовнику інструмент у перший же день розробки. Я налаштовую її рівно настільки, щоб вона була зручною, але не витрачаю на неї тижні".


6. 🧩 Підсумок

Отже, що ми сьогодні зробили? 1. Зрозуміли, що Django пише інтерфейс за нас. 2. Навчилися реєструвати моделі в адмінці. 3. Освоїли кастомізацію: таблиці, пошук, фільтри. 4. Зрозуміли, що це інструмент для персоналу, а не для клієнтів.

Що ви тепер вмієте? Ви можете створити повноцінну систему управління контентом (CMS) за 10 хвилин. Серйозно, люди платять за це гроші.

Тизер: Зараз у нас є дані і є зручна адмінка для їх редагування. Але звичайний користувач інтернету не бачить адмінки. Як нам витягнути ці дані з бази і красиво показати їх на сайті? На наступному уроці ми поговоримо про Views (Відображення) та Templates (Шаблони). Ми навчимо Django розмовляти з користувачем мовою HTML.

А поки — експериментуйте з адмінкою. Це ваша пісочниця! 🚀