JavaRush /Курси /Модуль 3: Django /Робота з контекстом у шаблонах Django

Робота з контекстом у шаблонах Django

Модуль 3: Django
Рівень 5 , Лекція 1
Відкрита

У цій лекції ми розберемо, як передавати дані з представлень у шаблони та використовувати контекст. Це один із ключових інструментів для роботи з даними, який забезпечує їх доставку прямо в 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-контекстом проста, але іноді можуть виникати помилки:

  1. Якщо ви передаєте None замість значення, воно може бути інтерпретоване як порожній рядок у шаблоні. Наприклад, {{ пусте_значення }} не викличе помилку, а просто нічого не відобразить.

  2. Помилки в ключах контексту. Якщо ви намагаєтеся звернутися до неіснуючого ключа, вираз поверне порожній рядок. Наприклад:

    {{ nonexistent_key }}
    

    Це не викличе Exceptions, але потенційно призведе до "порожніх" місць на сторінці.

  3. Неправильне звернення до вкладеної структури. Наприклад, спроба звернутися до неіснуючого атрибута об'єкта у шаблоні може повернути порожній рядок.

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

Застосування: навіщо це потрібно?

Контекст – це основний інструмент для передачі даних з "світу Python" у "світ HTML". У реальних проєктах контекст використовується для відображення інформації з сервера:

  • Відображення списку товарів в інтернет-магазині.
  • Виведення профілю користувача після авторизації.
  • Динамічне оновлення новин, блогів або коментарів.

Тепер, коли ви освоїли контекст, ви готові створювати повноцінні динамічні сторінки, що відображають дані з Python-коду. Наступним завданням буде покращення організації шаблонів за допомогою наслідування!

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ