Ось твій урок у стилі 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.
- Ми не пишемо все в одному файлі. Ми розділяємо обов'язки.
- Model зберігає дані.
- Template показує красу.
- View керує оркестром.
Що ви тепер вмієте?
Ви розумієте, куди дивитися в проекті Django, якщо треба:
* Додати нове поле в базу даних (ага, це в models.py).
* Змінити колір кнопки (це в templates).
* Змінити логіку, які саме товари показувати (це в views.py).
🚀 Тизер наступного уроку: Сьогодні ми сказали: "Model працює з базою даних". Але як саме Python перетворюється на SQL-запити без знання SQL? На наступному уроці ми заглянемо в магічний світ Django ORM і навчимося керувати базами даних силою думки (і коду Python)!
До зустрічі!