Давайте зробимо крок вперед і познайомимося з TemplateView, одним із найбільш часто використовуваних інструментів CBV, який спрощує процес відображення даних у шаблонах.
1. Що таке TemplateView?
Отже, почнемо з найголовнішого: TemplateView у Django — це готовий клас представлення, призначений для відображення HTML-шаблонів. Якщо ваше завдання — просто вивести статичну сторінку (або сторінку з мінімальними даними), то TemplateView стане вашим найкращим другом. Забудьте про зайві рядки коду: цей інструмент створений для простоти та зручності.
TemplateView ідеально підходить для таких завдань:
- Відображення статичних сторінок, наприклад, сторінки "Про нас" або "Контакти".
- Рендеринг сторінок з мінімальною логікою.
- Створення "тимчасових заглушок" (поки дизайн не готовий, наприклад).
Основний принцип роботи TemplateView
TemplateView — це клас, який автоматично шукає і відображає HTML-шаблон, ім'я якого ви йому вкажете. Ваша участь зводиться до передачі атрибутів template_name і (іноді) налаштування контексту за допомогою методу get_context_data().
2. Робота з TemplateView
Тепер давай подивимося, як на практиці працювати з цим магічним класом. Спочатку потрібно створити новий маршрут, прив'язати його до TemplateView і вказати, який шаблон буде використовуватися.
2.1. Приклад використання TemplateView
Припустимо, у нас є сторінка "Про компанію". Нам потрібно відобразити HTML-шаблон з цією інформацією.
Крок 1: Створимо шаблон
Спочатку створимо файл about.html у папці templates нашого застосунку:
<!-- templates/about.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Про компанію</title>
</head>
<body>
<h1>Про нашу компанію</h1>
<p>Ми — команда розробників, які навчають Django і люблять писати код.</p>
</body>
</html>
Крок 2: Налаштування маршруту
Тепер додамо новий маршрут у urls.py нашого застосунку:
# urls.py
from django.urls import path
from django.views.generic import TemplateView
urlpatterns = [
path('about/', TemplateView.as_view(template_name='about.html'), name='about'),
]
І все. Серйозно. Це все! Перейшовши за адресою http://127.0.0.1:8000/about/, ти побачиш свою сторінку "Про компанію". Без зайвого коду, без ручного рендера — просто краса.
3. Налаштування даних, що відображаються
3.1. Передача даних через get_context_data()
Добре, а що, якщо тобі потрібно передати на цю сторінку якусь динамічну інформацію? Наприклад, список послуг або поточну дату? Для цього використовуємо метод get_context_data().
Приведемо приклад. Припустимо, ми хочемо передавати список наших послуг у шаблон. Для цього створимо свій клас на основі TemplateView і перевизначимо метод get_context_data().
# views.py
from django.views.generic import TemplateView
class AboutView(TemplateView):
template_name = 'about.html'
def get_context_data(self, **kwargs):
# Отримуємо вихідний контекст
context = super().get_context_data(**kwargs)
# Додаємо дані
context['services'] = ['Веб-розробка', 'Мобільні додатки', 'UI/UX дизайн']
return context
Тепер оновимо наш urls.py:
# urls.py
from django.urls import path
from .views import AboutView
urlpatterns = [
path('about/', AboutView.as_view(), name='about'),
]
І змінимо шаблон about.html, щоб відобразити ці дані:
<!-- templates/about.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Про компанію</title>
</head>
<body>
<h1>Про нашу компанію</h1>
<p>Ми — команда розробників, які навчають Django і люблять писати код.</p>
<h2>Наші послуги:</h2>
<ul>
{% for service in services %}
<li>{{ service }}</li>
{% endfor %}
</ul>
</body>
</html>
Перейшовши за адресою /about/, ти побачиш список послуг, який передається через метод get_context_data().
3.2. Перевизначення dispatch()
Іноді тобі може знадобитися додати трохи "магії" до обробки запиту або після. Для цього можна перевизначити метод dispatch().
Давай подивимося, як можна організувати логування візитів на сторінку.
Припустимо, ми хочемо відстежувати, скільки разів відкривали сторінку "Про компанію":
# views.py
from django.views.generic import TemplateView
class AboutView(TemplateView):
template_name = 'about.html'
def dispatch(self, request, *args, **kwargs):
# Логуємо відвідування
print("Сторінка 'Про компанію' була відкрита!")
return super().dispatch(request, *args, **kwargs)
Тепер, кожного разу, коли хтось відкриє цю сторінку, у консолі сервера буде з'являтися повідомлення.
4. Використання TemplateView в реальних проєктах
У реальному житті TemplateView найчастіше використовується для створення "статичних" сторінок, таких як:
- Головна сторінка: можна відобразити вітальне повідомлення, динамічні сповіщення.
- Сторінки помилок: 404, 500 та інші.
- Інформаційні сторінки: "Контакти", "Політика конфіденційності" тощо.
Для прикладу створимо сторінку "Контакти". При цьому вкажемо в шаблоні адресу компанії, номер телефону та email.
Шаблон contact.html:
<!-- templates/contact.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Контакти</title>
</head>
<body>
<h1>Контакти</h1>
<p>Адреса: Вулиця Пітона, будинок 42</p>
<p>Телефон: +7 (123) 456-78-90</p>
<p>Email: contact@example.com</p>
</body>
</html>
Маршрут у urls.py:
# urls.py
from django.urls import path
from django.views.generic import TemplateView
urlpatterns = [
path('contact/', TemplateView.as_view(template_name='contact.html'), name='contact'),
]
5. Плюси і мінуси TemplateView
Плюси:
- Простота: мінімум коду для стандартних завдань.
- Гнучкість: можна легко налаштувати параметри й перевизначити потрібні методи.
- Зручність: ідеально для сторінок з мінімальною бізнес-логікою.
Мінуси:
- Обмеженість: якщо логіка стає складною, TemplateView швидко стає незручним.
- Перевизначення методів: іноді доводиться писати більше коду, ніж хотілося б.
Але пам'ятайте: як і з будь-яким інструментом, важливо використовувати TemplateView тоді, коли в цьому є сенс.
Отже, сьогодні ви дізналися, як працювати з TemplateView, як передавати дані в шаблони через get_context_data() і чому це представлення дуже важливе в реальних проєктах. У наступних лекціях ми заглибимося в інші види CBV, які допоможуть вам навести лад навіть у найзаплутаніших проєктах!
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ