Базовый шаблон Django

У всех сайтов есть свой стиль, своя обложка, которая не меняется от страницы к странице. Внутри этой рамки меняется только контент, но сама рамка остаётся неизменной. Вот, например, как это выглядит на Хабре:

Но что, если вам захочется поменять что-то в этой обложке? Например, логотип. Придётся менять логотип в каждом шаблоне вашего сайта. Это совершенно неудобно и порождает копипасту: однажды вы пропустите один из шаблонов и на каких-то страницах будет старый логотип, а на каких-то — новый. Чтобы такое избежать, можно вынести “обложку” в отдельный файл, и сказать, что это базовый шаблон. Вот как он может выглядеть:

Файл blog-base.html

{% load static %}
<html>
    <head>
        <title>Django Girls blog</title>
        <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
        <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css">
        <link href="//fonts.googleapis.com/css?family=Lobster&subset=latin,latin-ext" rel="stylesheet" type="text/css">
        <link rel="stylesheet" href="{% static `css/blog.css` %}">
    </head>
    <body>
            {% block content %}
            {% endblock %}
    </body>
....

В этом файле только “обложка” блога. Вместо “контента” здесь загадочная надпись {% block content %}.

Чтобы воспользоваться этой обложкой, нужно сделать 2 вещи: сказать, где лежит обложка и определить, что будет лежать в {% block content%}.

Указать путь можно с помощью тега extends:

{% extends 'blog-base.html' %}

Далее тут же определяем блок контента в файле index.html:

{% extends 'blog-base.html' %}

{% block content %}
  <header class="header_area">
  {% for post in posts %}
    {{post.title}}
  {% endfor %}
  ...
{% endblock %}

Django поймёт, что вы хотите воспользоваться базовым шаблоном и найдёт его в файле blog-base.html, который указан в extends. Дальше она найдёт в нём блок {% block content %} и подставит туда такой же блок из файла index.html.

Теперь все странички можно подключать к blog-base.html, чтобы получить обложку, а сам контент определять внутри {% block content %}.


Попробуйте бесплатные уроки по Python

Получите крутое код-ревью от практикующих программистов с разбором ошибок и рекомендациями, на что обратить внимание — бесплатно.

Переходите на страницу учебных модулей «Девмана» и выбирайте тему.