Модуль 2

Архітектура Django та MTV-патерн

Ось твій урок у стилі CS50. Вмикаймо уяву, закачуємо рукави і поїхали!


🎓 УРОК: Архітектура Django та MTV-патерн

1. 🔥 Вступ: Хаос на кухні та навіщо нам порядок

Уявіть, що ви відкрили ресторан. Але у вас немає ні офіціантів, ні кухарів, ні прибиральників. Ви робите все самі: приймаєте замовлення, біжите на склад за продуктами, ріжете овочі, смажите м’ясо, розкладаєте це на тарілки, виносите клієнту і ще й рахунок виписуєте.

Як довго ви протримаєтесь? Годину? День? Потім ви збожеволієте, а клієнти підуть голодними.

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

Питання до вас: Якби ви наймали персонал у ресторан, на які три головні ролі ви б розділили обов'язки, щоб процес йшов ідеально?

(Подумайте секунду...)

Швидше за все, ви скажете: 1. Хтось відповідає за продукти (комірник). 2. Хтось готує і керує процесом (шеф-кухар). 3. Хтось оформлює подачу страви (сервірування).

Саме це і робить Django! Він розділяє наш код на логічні частини, щоб ми не збожеволіли. Цей підхід називається MTV.


2. 🧠 Теоретична база: Що таке MTV?

У світі програмування є відомий патерн MVC (Model-View-Controller). Але Django — хлопець особливий, він використовує свою термінологію: MTV (Model-Template-View).

Давайте розберемо, як це працює "під капотом", використовуючи нашу аналогію з рестораном.

🏛️ 1. Model (Модель) — Це "Комірник"

  • Що це: Це ваше з’єднання з базою даних.
  • Як це працює: Ви не пишете SQL-запити вручну (SELECT * FROM...). Ви описуєте дані класами Python. Модель знає все про ваші дані: які вони, як вони пов'язані, як їх зберегти.
  • Аналогія: Це комірник, який точно знає, де лежить "Морква" (дані) і скільки її залишилося.

🎨 2. Template (Шаблон) — Це "Сервірування"

  • Що це: Це те, що бачить користувач. HTML, CSS, верстка.
  • Як це працює: Це файл з HTML-кодом, куди ми вставляємо спеціальні "дірки" (змінні), в які потім підставимо реальні дані.
  • Аналогія: Це чиста тарілка, на яку красиво викладають страву перед тим, як винести її в зал. Сама тарілка не смачна, але без неї їсти незручно.

⚙️ 3. View (Представлення) — Це "Шеф-кухар" (або Мозок)

  • Що це: Це місце, де живе логіка.
  • Як це працює: View отримує запит від користувача (наприклад, "покажи мені список статей"), йде до Model за даними, обробляє їх і передає у Template, щоб сформувати красиву сторінку.
  • Аналогія: Шеф-кухар отримує замовлення, кричить комірнику "Дай мені м'ясо!", смажить його і кладе на тарілку.

🚦 URL Dispatcher (Диспетчер посилань)

Це не частина абревіатури, але це "Офіціант" або "Хостес". Він зустрічає користувача на вході (аналізує URL-адресу, наприклад mysite.com/blog/) і направляє його до правильного View.

❗️ Запам'ятайте головне: * Model = Дані (База даних). * Template = Зовнішній вигляд (HTML). * View = Логіка (Python-функція, яка все зв'язує).


3. 🧪 Приклади: Від простого до реального

Давайте створимо сторінку блогу.

Крок 1: Model (Дані)

У нас є база даних. Нам потрібна таблиця для постів. Що ви очікуєте побачити в коді? Напевно, опис полів: заголовок, текст, дата.

# models.py
from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=200) # Заголовок
    text = models.TextField()                # Текст статті
    created_date = models.DateTimeField()    # Дата

Пояснення: Django автоматично створить таблицю в базі даних на основі цього класу. Магія!

Крок 2: View (Логіка)

Тепер нам треба дістати ці пости і віддати користувачу. Як шеф-кухар це зробить?

# views.py
from django.shortcuts import render
from .models import Post

def post_list(request):
    # 1. Йдемо до комірника (Model) і просимо всі пости
    posts = Post.objects.all()

    # 2. Віддаємо ці пости на тарілку (Template)
    return render(request, 'blog/post_list.html', {'posts': posts})

Пояснення: Функція post_list бере запит, витягує дані та "рендерить" (малює) шаблон.

Крок 3: Template (Вигляд)

Як виглядає наш HTML? Він має бути динамічним. Ми не пишемо 10 разів HTML-код для 10 статей. Ми пишемо цикл.

<!-- blog/post_list.html -->
<html>
    <body>
        <h1>Мій блог</h1>

        <!-- Магічна мова шаблонів Django -->
        {% for post in posts %}
            <div>
                <h2>{{ post.title }}</h2>
                <p>{{ post.text }}</p>
                <hr>
            </div>
        {% endfor %}

    </body>
</html>

Пояснення: Конструкція {% for ... %} пробігається по списку, який передав View, і генерує HTML для кожного поста.


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

Час кодити! Уявіть, що ви працюєте над сайтом бібліотеки.

Завдання 1 (Повторення): Напишіть на папері або в редакторі код для models.py для сутності Book (Книга). Вона має мати title (назва) та author (автор).

Завдання 2 (Зв'язок): Ви написали View, яка називається book_detail. Вона має показувати одну конкретну книгу. Допишіть пропущений рядок, який передає книгу в шаблон:

def book_detail(request, pk):
    book = Book.objects.get(pk=pk) # Отримуємо книгу за ID
    # ВАШ КОД ТУТ: поверніть render з шаблоном 'book.html' і контекстом

Завдання 3 (Дебаг): Студент написав такий код у views.py:

def home(request):
    return "<h1>Привіт, світ!</h1>"

Django видає помилку. Чому? Підказка: Django View завжди має повертати спеціальний об'єкт відповіді (HttpResponse або render), а не просто рядок тексту.

Завдання 4 (Міні-кейс): У вас є інтернет-магазин. 1. Користувач заходить на /products/sneakers. 2. urls.py бачить це і викликає View show_category. 3. Опишіть словами, що має зробити View show_category далі, дотримуючись MTV-патерну.

Завдання 5 ("А що, якщо..."): Що станеться, якщо ми змінимо дизайн у файлі Template (наприклад, змінимо колір заголовка)? Чи потрібно нам змінювати код у Model або View? Чому це круто?


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

Як відрізнити новачка від профі в Django?

Помилка новачка: Пихати логіку в Шаблон. Наприклад, намагатися фільтрувати товари прямо в HTML-файлі за допомогою {% if %}. Чому це погано: Шаблон має бути "дурним". Він тільки показує. Якщо ви почнете програмувати в HTML, ви отримаєте хаос.

Помилка новачка №2: Пихати логіку відображення у View. Наприклад, формувати HTML-рядки всередині Python-функції.

Як думає профі (Принцип "Товста Модель, Худе Представлення"): * Model: Тут живе бізнес-логіка. Якщо треба порахувати знижку на товар — це метод Моделі. * View: Це просто диспетчер. Він взяв дані, можливо, перевірив права доступу, і віддав шаблон. Він має бути максимально коротким ("худим"). * Template: Просто картинка.

Порада: Якщо ви не знаєте, куди покласти шматок коду — запитайте себе: "Це стосується даних (Model), логіки обробки запиту (View) чи зовнішнього вигляду (Template)?".


6. 🧩 Підсумок

Отже, ми розібрали "скелет" Django.

  1. Ми не пишемо все в одному файлі. Ми розділяємо обов'язки.
  2. Model зберігає дані.
  3. Template показує красу.
  4. View керує оркестром.

Що ви тепер вмієте? Ви розумієте, куди дивитися в проекті Django, якщо треба: * Додати нове поле в базу даних (ага, це в models.py). * Змінити колір кнопки (це в templates). * Змінити логіку, які саме товари показувати (це в views.py).

🚀 Тизер наступного уроку: Сьогодні ми сказали: "Model працює з базою даних". Але як саме Python перетворюється на SQL-запити без знання SQL? На наступному уроці ми заглянемо в магічний світ Django ORM і навчимося керувати базами даних силою думки (і коду Python)!

До зустрічі!