Skip to content

Latest commit

 

History

History
221 lines (152 loc) · 8.8 KB

File metadata and controls

221 lines (152 loc) · 8.8 KB

Модуль 2. Урок 8. Передача данных (переменных) в шаблоны Django

Когда мы только начали работать с Django, страницы нашего сайта были статичными — то есть каждый HTML-файл выглядел одинаково для всех пользователей. Но настоящие сайты так не работают: на главной странице показываются новинки фильмов, на странице фильма — его описание, на странице актёра — список ролей. Все эти данные нужно как-то передавать из Python-кода (представления) в HTML-шаблон, чтобы шаблон мог «подставить» нужную информацию.


1. Как работает передача данных в Django

Механизм довольно простой и универсальный:

  1. В файле views.py мы подготавливаем данные, например — заголовок страницы или список фильмов.
  2. Передаём эти данные в функцию render(), которая объединяет их с HTML-шаблоном.
  3. Django заменяет специальные конструкции в шаблоне (например {{ title }}) на реальные значения.

Проще говоря: views.py → формирует данные templates → отображает их в HTML.


2. Передача одной переменной

Начнём с самого простого примера — одной переменной.

Шаг 1. Изменим представление

В файле views.py нашего приложения movies создадим функцию index():

from django.shortcuts import render

def index(request):
    data = {'title': 'Главная страница CinemaHub'}
    return render(request, 'movies/index.html', data)

Мы создали словарь data, в котором указали одно поле title. Затем передали его в шаблон index.html.

Шаг 2. Настроим шаблон

Файл templates/movies/index.html:

<!DOCTYPE html>
<html lang="ru">
  <head>
    <meta charset="UTF-8">
    <title>{{ title }}</title>
  </head>
  <body>
    <h1>{{ title }}</h1>
    <p>Добро пожаловать в проект CinemaHub!</p>
  </body>
</html>

В фигурных скобках {{ title }} мы вставляем переменную из контекста. Django подставит значение 'Главная страница CinemaHub'.


Проверка результата

  1. Запусти сервер командой:

    python manage.py runserver
  2. Открой в браузере страницу http://127.0.0.1:8000/.

Если всё сделано правильно, на странице появится заголовок: Главная страница CinemaHub


3. Передача нескольких переменных

Теперь попробуем передать сразу несколько значений: текст, список, словарь и даже объект.

Шаг 1. Добавляем данные в представление

class Movie:
    def __init__(self, title, year):
        self.title = title
        self.year = year


def index(request):
    data = {
        'title': 'Главная страница CinemaHub',
        'subtitle': 'Каталог фильмов и сериалов',
        'genres': ['Драма', 'Комедия', 'Фантастика'],
        'ratings': {'Interstellar': 9.0, 'Oppenheimer': 8.8},
        'movie': Movie('Inception', 2010),
    }
    return render(request, 'movies/index.html', data)

Шаг 2. Выведем данные в шаблон

Файл templates/movies/index.html:

<!DOCTYPE html>
<html lang="ru">
  <head>
    <meta charset="UTF-8">
    <title>{{ title }}</title>
  </head>
  <body>
    <h1>{{ title }}</h1>
    <h2>{{ subtitle }}</h2>

    <h3>Жанры:</h3>
    <p>{{ genres }}</p>

    <h3>Рейтинги:</h3>
    <p>{{ ratings }}</p>

    <h3>Объект Movie:</h3>
    <p>{{ movie }}</p>
  </body>
</html>

Если обновить страницу, Django подставит в шаблон значения всех переменных. Обрати внимание: списки, словари и объекты отобразятся как текст, потому что мы их просто вывели «как есть».


4. Обращение к элементам коллекций и атрибутам объектов

Шаблоны Django позволяют обращаться к элементам коллекций (словари, списки) и к атрибутам объектов через точку.

Примеры:

<p>Первый жанр: {{ genres.0 }}</p>
<p>Рейтинг фильма Interstellar: {{ ratings.Interstellar }}</p>
<p>Название фильма: {{ movie.title }}</p>
<p>Год выпуска: {{ movie.year }}</p>

Теперь шаблон подставит конкретные значения:

  • {{ genres.0 }}Драма
  • {{ movie.title }}Inception

5. Как Django подставляет данные

Когда Django рендерит шаблон, он проходит по всем {{ ... }} и ищет соответствие в переданном контексте. Если переменной нет — Django просто выведет пустую строку. То есть {{ something }} не вызовет ошибку, но и не покажет ничего на экране.


6. Ключи с пробелами

Попробуй изменить словарь ratings, добавь туда свой любимый фильм и рейтинг. Затем выведи его в шаблоне. Например:

'ratings': {'Interstellar': 9.0, 'Oppenheimer': 8.8, 'The Dark Knight': 9.1}

В Django-шаблонах прямое обращение через точку, как {{ ratings.The Dark Knight }}, не сработает, потому что шаблонизатор воспринимает точку как обращение к атрибуту или ключу без пробелов:

<p>Рейтинг The Dark Knight: {{ ratings.The Dark Knight }}</p>

Вызовет ошибку!


7. Проверка и отладка

Если ты видишь пустое место вместо значения переменной, проверь:

  1. Совпадает ли имя переменной в шаблоне и в словаре контекста.
  2. Правильно ли ты передал context=data в render().
  3. Не забыл ли перезапустить сервер после изменений.

Итоги урока

Теперь ты знаешь:

  • как передавать данные из представлений в шаблоны;
  • как обращаться к элементам списков, словарей и атрибутам объектов;
  • как Django динамически формирует содержимое страницы.

Это фундамент: на нём строится всё — от простых сайтов до крупных веб-приложений.


Вопросы

  1. Зачем нужны переменные в шаблонах Django?
  2. Что делает функция render()?
  3. Как в шаблоне обратиться к атрибуту объекта Python?
  4. Что произойдёт, если в шаблоне указать переменную, которой нет в контексте?
  5. Как обратиться к первому элементу списка genres в шаблоне?
  6. Можно ли вывести словарь напрямую в шаблон?
  7. Какой тип данных передаётся в шаблон из представления?
  8. Почему важно соблюдать имена переменных при передаче данных?
  9. Как в шаблоне обратиться к ключу словаря ratings.Interstellar?
  10. Что нужно сделать, если после обновления шаблон не показывает новые данные?

Предыдущий урок | Следующий урок