JavaRush /Курсы /Модуль 3: Django /Использование include для переиспользования шаблонов

Использование include для переиспользования шаблонов

Модуль 3: Django
5 уровень , 8 лекция
Открыта

Сегодня мы будем говорить о том, как делать ваш код в шаблонах Django более читаемым, модульным и дружелюбным для изменений. Скажем "нет" копипасте кода в каждом файле шаблона и сократим количество ошибок, связанных с обновлением одного и того же контента в нескольких местах.

На помощь в этом приходит замечательный инструмент — тег {% include %}.

Что такое {% include %}?

Тег {% include %} — это волшебная палочка в Django Template Language (DTL), которая позволяет встроить содержимое одного шаблона в другой. Он идеально подходит для таких случаев, когда часть HTML-кода повторяется на страницах, и вы не хотите копировать и вставлять его во все файлы. Вместо этого вы создаёте небольшой шаблон для этой повторяющейся части, а потом просто "включаете" его в нужных местах.

Пример использования {% include %}

1. Создаём файл для общего шаблона

Допустим, у нас есть сайт с несколькими страницами, и каждая из них имеет одинаковый футер (подвал). Вместо того чтобы копировать код футера в каждый шаблон, мы вынесем его в отдельный файл.

Создайте файл footer.html в директории ваших шаблонов, например:

project/
├── templates/
│   ├── base.html
│   ├── home.html
│   ├── about.html
│   └── footer.html

Наполнение footer.html может быть следующим:

<footer>
    <p>&copy; 2023, My Super Awesome Django Project</p>
</footer>

2. Используем {% include %} в других шаблонах

Теперь включим этот файл в другие шаблоны. Например, вот так выглядит ваш base.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{% block title %}My Django Site{% endblock %}</title>
</head>
<body>
    <header>
        <h1>Welcome to My Django Project</h1>
    </header>

    <main>
        {% block content %}{% endblock %}
    </main>

    <!-- Вставим наш футер здесь -->
    {% include 'footer.html' %}
</body>
</html>

Теперь каждый шаблон, который наследует base.html, автоматически получит футер.

Особенности использования {% include %}

  1. Передача данных в включаемые шаблоны

Иногда включаемым шаблонам нужны данные. Например, представим, что футер должен отображать текущий год. Это легко сделать.

В вашем представлении (views.py) нужно передать текущий год в контекст:

from datetime import datetime
from django.shortcuts import render

def home(request):
    context = {
        'current_year': datetime.now().year
    }
    return render(request, 'home.html', context)

Теперь модифицируйте footer.html, чтобы использовать переданные данные:

<footer>
    <p>&copy; {{ current_year }}, My Super Awesome Django Project</p>
</footer>

Футер автоматически обновится, когда наступит следующий год (ура, меньше ручной работы!).

2. Обработка ошибок при включении

Если включаемый файл не найден, Django выбросит ошибку TemplateDoesNotExist. Чтобы избежать этого, можно воспользоваться специальным параметром only, который отключает передачу контекста во включаемый шаблон. Используйте это, если уверены, что включаемому шаблону не нужны данные из контекста.

{% include 'footer.html' only %}

Если вдруг файл отсутствует, можно использовать default:

{% include 'footer.html' only %} {% default %}
  1. Включаем файлы из подкаталогов

Для более сложных проектов шаблоны часто организовывают по папкам. Например:

project/
├── templates/
│   ├── includes/
│   │   ├── header.html
│   │   ├── footer.html
│   │   └── sidebar.html
│   ├── base.html
│   └── home.html

Теперь, чтобы подключить футер, указываем полный путь:

{% include 'includes/footer.html' %}

Такой подход упрощает навигацию и поддержание порядка.

Практический пример: повторяющийся хедер и футер

Давайте сделаем пример с навигацией и футером, которые используются на всех страницах.

  1. Создайте header.html:
<header>
    <nav>
        <ul>
            <li><a href="/">Home</a></li>
            <li><a href="/about/">About</a></li>
            <li><a href="/contact/">Contact</a></li>
        </ul>
    </nav>
</header>
  1. Создайте footer.html:
<footer>
    <p>&copy; {{ current_year }} Your Django Project</p>
</footer>
  1. Измените base.html:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{% block title %}My Django Site{% endblock %}</title>
</head>
<body>
    <!-- Включаем хедер -->
    {% include 'includes/header.html' %}

    <main>
        {% block content %}{% endblock %}
    </main>

    <!-- Включаем футер -->
    {% include 'includes/footer.html' %}
</body>
</html>

Теперь хедер и футер автоматически отображаются на всех страницах, что наследуют base.html.

Советы и лучшие практики

  1. Не злоупотребляйте include: разделяйте шаблоны только тогда, когда это действительно снижает дублирование кода. Если часть HTML уникальна для одной страницы, лучше оставить её в шаблоне этой страницы.

  2. Используйте логические имена для файлов: шаблоны в папке includes должны быть легко узнаваемыми. Например, header.html лучше, чем top_part.html.

  3. Думайте о модульности: делайте содержимое включаемых шаблонов независимым. Чем меньше они зависят от внешних данных, тем проще их переиспользовать.

  4. Следите за контекстом: всегда знайте, какие переменные доступны в включаемом шаблоне, чтобы избежать ошибок.

С помощью {% include %} ваш код в шаблонах станет компактнее, логичнее и проще в поддержке. Unicode, DRY-принцип и ваш будущий коллега, который возьмёт проект на поддержку, будут вам благодарны!

1
Задача
Модуль 3: Django, 5 уровень, 8 лекция
Недоступна
Создание простого включаемого шаблона
Создание простого включаемого шаблона
1
Задача
Модуль 3: Django, 5 уровень, 8 лекция
Недоступна
Повторное использование шаблонов для навигации и футера
Повторное использование шаблонов для навигации и футера
Комментарии (1)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Ivan Уровень 59
9 июля 2025
В заданиях отсутствуют какие-либо папки и файлы. Так что нужно либо создать новый проект с нуля, либо скопировать из предыдущего задания и немного подправить.