Наследование шаблонов и статические файлы

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

Если внимательно посмотреть предыдущие примеры шаблонов, видны большие блоки одинакового кода: панель навигации, заголовок, блоки со служебными тегами и т.д. Это увеличивает общий объем используемых шаблонов, а также усложняет внесение изменений – например, для добавления нового пункта в меню, понадобится редактирование всех файлов с данным блоком.

Для решения данной проблемы используется наследование шаблонов (аналогично наследованию классов). Шаблон, который является базовым, содержит повторяющийся код, в определенных местах которого объявляются блоки, указывающие места вставки содержимого из производных шаблонов. Каждый такой блок должен иметь уникальное в пределах текущего шаблона имя.

Для примера создадим базовый шаблон, содержащий следующие блоки:

title – будет вставляться в тег <title> и выводить название текущей страницы;
content – размещение уникального содержимого страниц.

Далее создадим в каталоге templates папку layout, в котором создадим базовый шаблон basic.html:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>{% block title %}Главная {% endblock %} ||
        Доска объявлений</title>
    </head>
    <body>
        <header>
            <h1>Объявления</h1>
        </header>
        <nav>
            <a href="{% url 'index' %}">Главная</a>
            <a href="{% url 'add' %}">Добавить</a>
            {% for rubric in rubrics % }
            <a href="{% url 'by_rubric' rubric.pk %}">
            {{ rubric.name }}</a>
            {% endfor %}
        </nav>
        <section>
        {% block content %}
        {% endblock %}
        </section>
    </body>
</html>

Тег шаблонизатора block обозначает начало объявляемого блока, за ним должно идти имя нового блока. Конец блока обозначается тегом endblock.

При этом блок, объявленный в базовом шаблоне, может быть пустым (в примере это блок content) или уже иметь содержимое (блок title). В последнем случае текст будет выведен, если производный шаблон не передаст собственное наполнение.

Создадим новый шаблон bboard\index.html, сделав его производным от созданного ранее шаблона layout\basic.html. Код шаблона:

{% extends "layout\basic.html" %}
{% block content %}
{% for bb in bbs %}
<div>
    <h2>{{ bb.title }}</h2>
    <p>{{ bb.content }}</p>
    <p><a href="{% url 'by_rubric' bb.rubric.pk %}">
    {{ bb.rubric.name }}</a></p>
    <p>{{ bb.published | date: "d.m.Y H:i:s" }}</p>
</dev>
{% endfor %}
{% endblock %}

Производный шаблон должен начинаться с тега extends, в котором прописывается путь к шаблону, который является базовым. Далее при помощи тегов block и endblock объявляются нужные блоки.

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

Аналогичные изменения внесем в шаблон bboard\create.html:

{% extends "layout/basic.html" %}

{% block title %}Добавление объявления{% endblock %}

{% block content %}
<h2> Добавление объявления </h2>
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <input type = "submit" value= "Добавить">
</form>
{% endblock %}

А также в шаблон bboard\by_rubric.html:

{% extends "layout/basic.html" %}

{% block title %}{{ current_rubric.name }}{% endblock %}

{% block content %}
<h2>Рубрика: {{ current_rubric.name }}</h2>
{% for bb in bbs %}
<div>
    <h3>{{ bb.title }}</h2>
    <p>{{ bb.content }}</p>
    <p>{{ bb.published|date:"d.m.Y H:i:s" }}</p>
</div>
{% endfor %}
{% endblock %}

Статические файлы

Тестовый сайт почти готов. Осталось только при помощи таблицы стилей style.css сделать страницы более красивыми.

header h1 {
    font-size: 40pt;
    text-transform: uppercase;
    text-align: center;
    background: url("bg.jpg") left / auto 100% no-repeat;
}
nav {
    font-size: 16pt;
    width: 150px;
    float: left;
}
nav a {
    display: block;
    margin: 15px 0px;
}
section {
    margin-left: 150px;
}

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

Файлы, которые при формировании страниц интернет-сайта отправляются клиенту без обработки, в терминологии Django принято называть статическими. К таким файлам, к примеру, относятся графические элементы и таблицы стилей.

Создадим в каталоге приложения bboard папку static, в ней вложенный каталог bboard. В него и сохраним картинку bg.jpg и файл style.css.

Откроем созданный ранее шаблон layout\basic.html и добавим в него следующие строки:

{% load static %}
<! DOCTYPE html>
<html>
    <head>
        . . .
        <link rel="stylesheet" type="text/css"
        href="{% static 'bboard/style.css' %}">
    </head>
    . . .
</html>

Тег load обеспечивает загрузку указанного модуля расширения, который содержит дополнительные фильтры и теги. В нашем случае загружается модуль static, в котором содержатся теги для вставки ссылок на нужные статические файлы.

Тег static позволяет сгенерировать полный адрес статического файла при помощи относительного. Он необходим в нашем случае для вставки в HTML-тег <link> корректной ссылки на таблицу стилей.

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





Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: