У цій лекції ми розберемо, як передавати дані з представлень у шаблони та використовувати контекст. Це один із ключових інструментів для роботи з даними, який забезпечує їх доставку прямо в HTML-шаблон.
Що таке контекст у шаблонах Django
Контекст – це не щось магічне. По суті, це словник даних, які представлення передає шаблону. Уявіть, що ви готуєте обід для гостей (шаблон), і вам потрібен список покупок (контекст). Контекст допомагає доставити потрібні інгредієнти (дані) до обіднього столу (HTML).
Контекст використовується для передачі значень, які можна відображати або використовувати у шаблонах. Наприклад, це може бути ім'я користувача, список новин, дані про товари, відфільтровані записи з бази даних і таке інше.
Під капотом контекст являє собою екземпляр Python-об'єкта dict. Але Django інтерпретує його і дозволяє вставляти дані прямо у HTML за допомогою синтаксису DTL.
Як дані з представлень потрапляють у шаблони
У Django представлення (views) відповідають за управління логікою додатку. І щоб передати дані шаблону, ми використовуємо контекст. Передача контексту здійснюється через метод render().
Приклад базового представлення з контекстом:
from django.shortcuts import render
def example_view(request):
# Дані, які ми передаємо у шаблон
context = {
'greeting': 'Привіт, світ!',
'name': 'Джанго-розробник'
}
# Передача даних у шаблон example.html
return render(request, 'example.html', context)
У наведеному прикладі ми створюємо словник context з двома ключами: greeting і name. Ці дані ми потім передаємо функції render(), яка об'єднує наш шаблон із контекстом.
Тепер шаблон example.html може використовувати передані дані:
<!DOCTYPE html>
<html>
<head>
<title>Приклад шаблону</title>
</head>
<body>
<h1>{{ greeting }}</h1>
<p>Ласкаво просимо, {{ name }}</p>
</body>
</html>
Результат у браузері:
Привіт, світ!
Ласкаво просимо, Джанго-розробник
Завдяки контексту ми легко зробили HTML динамічним.
Як використовувати контекст для складних даних
Припустимо, у нас є список даних, наприклад, статті блогу. Ми можемо передати їх у контекст і відобразити на сторінці.
Представлення:
def blog_view(request):
# Дані для відображення
articles = [
{'title': 'Перша стаття', 'author': 'Олексій'},
{'title': 'Друга стаття', 'author': 'Марія'},
{'title': 'Третя стаття', 'author': 'Іван'}
]
context = {
'articles': articles # Передаємо список словників
}
return render(request, 'blog.html', context)
Шаблон:
<!DOCTYPE html>
<html>
<head>
<title>Блог</title>
</head>
<body>
<h1>Список статей</h1>
<ul>
{% for article in articles %}
<li>{{ article.title }} — Автор: {{ article.author }}</li>
{% endfor %}
</ul>
</body>
</html>
Результат у браузері:
- Перша стаття — Автор: Олексій
- Друга стаття — Автор: Марія
- Третя стаття — Автор: Іван
Завдяки циклу {% for %} у шаблоні, ми змогли обробити список даних і вивести їх на сторінку.
Приклади зі словниками
Python-словник може бути досить складним, але Django чудово його інтерпретує. Ви можете звертатися до вкладених структур даних.
Представлення:
def user_profile_view(request):
user_profile = {
'name': 'Анна',
'age': 28,
'skills': ['Python', 'Django', 'JavaScript']
}
return render(request, 'profile.html', {'profile': user_profile})
Шаблон:
<!DOCTYPE html>
<html>
<head>
<title>Профіль користувача</title>
</head>
<body>
<h1>Профіль</h1>
<p>Ім'я: {{ profile.name }}</p>
<p>Вік: {{ profile.age }}</p>
<p>Навички:</p>
<ul>
{% for skill in profile.skills %}
<li>{{ skill }}</li>
{% endfor %}
</ul>
</body>
</html>
Використання умов та циклів у контексті
Django Template Language дозволяє відображати дані динамічно, наприклад, застосовуючи умови.
Умови у шаблоні
Представлення:
def conditional_view(request):
context = {
'is_logged_in': True,
'username': 'Поліна'
}
return render(request, 'conditional.html', context)
Шаблон:
<!DOCTYPE html>
<html>
<head>
<title>Приклад умов</title>
</head>
<body>
{% if is_logged_in %}
<p>Ласкаво просимо, {{ username }}!</p>
{% else %}
<p>Будь ласка, увійдіть у систему.</p>
{% endif %}
</body>
</html>
Якщо is_logged_in дорівнює True, ви побачите:
Ласкаво просимо, Поліна!
Якщо is_logged_in дорівнює False, буде відображено:
Будь ласка, увійдіть у систему.
Комбінація циклів та умов
Іноді передача контексту з даними потребує додавання одразу й циклів, і умов. Наприклад, фільтрація даних у шаблоні:
<ul>
{% for article in articles %}
{% if article.author == "Марія" %}
<li>{{ article.title }} (написано Марією)</li>
{% else %}
<li>{{ article.title }} (інший автор)</li>
{% endif %}
{% endfor %}
</ul>
Помилки та особливості роботи з контекстом
Робота з Django-контекстом проста, але іноді можуть виникати помилки:
Якщо ви передаєте
Noneзамість значення, воно може бути інтерпретоване як порожній рядок у шаблоні. Наприклад,{{ пусте_значення }}не викличе помилку, а просто нічого не відобразить.Помилки в ключах контексту. Якщо ви намагаєтеся звернутися до неіснуючого ключа, вираз поверне порожній рядок. Наприклад:
{{ nonexistent_key }}Це не викличе Exceptions, але потенційно призведе до "порожніх" місць на сторінці.
Неправильне звернення до вкладеної структури. Наприклад, спроба звернутися до неіснуючого атрибута об'єкта у шаблоні може повернути порожній рядок.
Для діагностики гарною практикою є використання інструментів для налагодження, таких як вбудований налагоджувач Django або друк даних контексту перед рендерингом шаблона.
Застосування: навіщо це потрібно?
Контекст – це основний інструмент для передачі даних з "світу Python" у "світ HTML". У реальних проєктах контекст використовується для відображення інформації з сервера:
- Відображення списку товарів в інтернет-магазині.
- Виведення профілю користувача після авторизації.
- Динамічне оновлення новин, блогів або коментарів.
Тепер, коли ви освоїли контекст, ви готові створювати повноцінні динамічні сторінки, що відображають дані з Python-коду. Наступним завданням буде покращення організації шаблонів за допомогою наслідування!
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ