📝 Html Css

Django: Наследование шаблонов

P
Автор
Pyland
📅
Опубликовано
30.06.2026
⏱️
Время чтения
2 мин
👁️
Просмотров
74
🌿
Уровень
Средний
🐦 💼 ✈️

Без наследования каждый HTML-шаблон содержал бы дублированный код: навигацию, подключение CSS/JS, футер. Наследование позволяет один раз написать каркас страницы и расширять его в дочерних шаблонах.

Принцип работы

  1. base.html — каркас с блоками-заглушками ({% block %})
  2. Дочерний шаблон объявляет {% extends 'base.html' %} и заполняет блоки

Django при рендере берёт дочерний шаблон, находит родительский и подставляет содержимое блоков.

base.html для DevBlog

{# templates/base.html #}
<!DOCTYPE html>
<html lang="ru">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>{% block title %}DevBlog{% endblock %}</title>

  {% load static %}
  <link rel="stylesheet"
        href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css">
  <link rel="stylesheet" href="{% static 'css/main.css' %}">

  {% block extra_css %}{% endblock %}
</head>
<body>

  <!-- Навигация -->
  <nav class="navbar navbar-expand-lg bg-dark navbar-dark">
    <div class="container">
      <a class="navbar-brand" href="{% url 'post-list' %}">DevBlog</a>
      <button class="navbar-toggler" type="button"
              data-bs-toggle="collapse" data-bs-target="#navMenu">
        <span class="navbar-toggler-icon"></span>
      </button>
      <div class="collapse navbar-collapse" id="navMenu">
        <ul class="navbar-nav ms-auto">
          <li class="nav-item">
            <a class="nav-link" href="{% url 'post-list' %}">Статьи</a>
          </li>
          <li class="nav-item">
            <a class="nav-link" href="{% url 'about' %}">Обо мне</a>
          </li>
        </ul>
      </div>
    </div>
  </nav>

  <!-- Сообщения Django (flash messages) -->
  {% if messages %}
    <div class="container mt-3">
      {% for message in messages %}
        <div class="alert alert-{{ message.tags }} alert-dismissible fade show">
          {{ message }}
          <button type="button" class="btn-close" data-bs-dismiss="alert"></button>
        </div>
      {% endfor %}
    </div>
  {% endif %}

  <!-- Основной контент -->
  <main class="container py-4">
    {% block content %}{% endblock %}
  </main>

  <!-- Футер -->
  <footer class="bg-dark text-light py-4 mt-5">
    <div class="container text-center">
      <p class="mb-0">© {{ now.year }} DevBlog. Сделано с Django.</p>
    </div>
  </footer>

  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
  {% block extra_js %}{% endblock %}

</body>
</html>

Блоки в base.html:

Блок Назначение
{% block title %} Заголовок вкладки браузера
{% block extra_css %} Дополнительные CSS для конкретной страницы
{% block content %} Основное содержимое страницы
{% block extra_js %} JS для конкретной страницы

Дочерний шаблон: список статей

{# templates/blog/post_list.html #}
{% extends 'base.html' %}

{% block title %}Статьи — DevBlog{% endblock %}

{% block content %}
  <h1>Все статьи</h1>
  <div class="row g-4">
    {% for post in posts %}
      <div class="col-12 col-md-6 col-lg-4">
        <div class="card h-100">
          <div class="card-body">
            <h5 class="card-title">
              <a href="{% url 'post-detail' slug=post.slug %}">{{ post.title }}</a>
            </h5>
            <p class="card-text text-muted">{{ post.summary }}</p>
          </div>
        </div>
      </div>
    {% endfor %}
  </div>
{% endblock %}

Дочерний шаблон: страница статьи

{# templates/blog/post_detail.html #}
{% extends 'base.html' %}

{% block title %}{{ post.title }} — DevBlog{% endblock %}

{% block extra_css %}
  <link rel="stylesheet" href="{% static 'css/highlight.css' %}">
{% endblock %}

{% block content %}
  <article>
    <h1>{{ post.title }}</h1>
    <p class="text-muted">{{ post.published_at|date:"d.m.Y" }}</p>
    <div class="post-body">
      {{ post.body|safe }}
    </div>
  </article>
{% endblock %}

{% block extra_js %}
  <script src="{% static 'js/highlight.js' %}"></script>
{% endblock %}

{{ block.super }} — расширение блока

{{ block.super }} вставляет содержимое блока из родителя, не заменяя его полностью:

{# В дочернем шаблоне: #}
{% block title %}{{ post.title }} — {{ block.super }}{% endblock %}
{# Результат: «Введение в Python — DevBlog» #}

Полезно для блоков с навигацией или скриптами, когда нужно добавить к существующему контенту, а не заменить его.

Уровни вложенности

Можно строить цепочки наследования: base.htmlbase_blog.htmlpost_detail.html. Но больше двух-трёх уровней затрудняет чтение — держитесь разумного предела.

base.html
  └── blog/base_blog.html  (добавляет боковую панель)
        ├── post_list.html
        └── post_detail.html

Ваша реакция на статью

💬 Комментарии (0)

🔐 Войдите в систему, чтобы оставить комментарий
🚪 Войти
💭

Комментариев пока нет

Станьте первым, кто поделится мнением об этой статье!

🔗 Похожие

Похожие статьи

Продолжите изучение с этими материалами

📝

pytest-django: тестирование Django

Охватываемые темы: Установка, @pytest.mark.djangodb, Фикстуры, Тестирование views.

📅 30.06.2026 👁️ 138
📝

Django: Теги шаблонов

Теги шаблонов — это логика внутри HTML. В отличие от {{ переменная }}, которая только...

📅 30.06.2026 👁️ 85
📝

Цвета и шрифты в CSS

Первое, что видит читатель DevBlog — текст. Правильно подобранные цвета и шрифты делают блог читабельным...

📅 30.06.2026 👁️ 78

Понравилась статья?

Подпишитесь на наши обновления и получайте новые статьи первыми. Развивайтесь вместе с PyLand!