0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Каждая страница любого сайта содержит свое содержимое и общие части - шапку, футер или боковое меню. И если с большим количеством однотипного кода страниц еще можно смириться, то настоящие сложности возникают при попытке изменить шаблоны. Легко случайно забыть внести изменения во все страницы. Чтобы избежать дублирования и потенциальных ошибок при изменениях однотипных страниц существует механизм наследования шаблонов. Мы можем создать базовый шаблон. Он будет содержать все общие элементы сайта и определять блоки, которые могут переопределять дочерние шаблоны.</p>
1
<p>Каждая страница любого сайта содержит свое содержимое и общие части - шапку, футер или боковое меню. И если с большим количеством однотипного кода страниц еще можно смириться, то настоящие сложности возникают при попытке изменить шаблоны. Легко случайно забыть внести изменения во все страницы. Чтобы избежать дублирования и потенциальных ошибок при изменениях однотипных страниц существует механизм наследования шаблонов. Мы можем создать базовый шаблон. Он будет содержать все общие элементы сайта и определять блоки, которые могут переопределять дочерние шаблоны.</p>
2
<p>Создадим новый шаблон<em>layout.html</em>со следующим содержимым:</p>
2
<p>Создадим новый шаблон<em>layout.html</em>со следующим содержимым:</p>
3
<p>Этот шаблон определяет базовую структуру нашего сайта. Важная деталь в нем это конструкция {% block <имя-блока>%} {% endblock %}. Во всех шаблонах-наследниках на место нее подставятся блоки с тем же именем из них.</p>
3
<p>Этот шаблон определяет базовую структуру нашего сайта. Важная деталь в нем это конструкция {% block <имя-блока>%} {% endblock %}. Во всех шаблонах-наследниках на место нее подставятся блоки с тем же именем из них.</p>
4
<p>Добавим новый шаблон-наследник:</p>
4
<p>Добавим новый шаблон-наследник:</p>
5
<p>Инструкция extends сообщает шаблонизатору, что этот шаблон "расширяет" другой шаблон. Теперь, когда шаблонизатор будет обрабатывать наш шаблон<em>index.html</em>, инструкция extends найдет родительский -<em>layout.html</em>. Далее она заменит в нем те блоки, которые мы переопределили в шаблоне<em>index.html</em>.</p>
5
<p>Инструкция extends сообщает шаблонизатору, что этот шаблон "расширяет" другой шаблон. Теперь, когда шаблонизатор будет обрабатывать наш шаблон<em>index.html</em>, инструкция extends найдет родительский -<em>layout.html</em>. Далее она заменит в нем те блоки, которые мы переопределили в шаблоне<em>index.html</em>.</p>
6
<p>Поскольку в шаблоне<em>index.html</em>мы не используем блок sidebar, вместо него будет использоваться значение из родительского шаблона. Содержимое внутри блока в родительском шаблоне всегда используется как значение по умолчанию.</p>
6
<p>Поскольку в шаблоне<em>index.html</em>мы не используем блок sidebar, вместо него будет использоваться значение из родительского шаблона. Содержимое внутри блока в родительском шаблоне всегда используется как значение по умолчанию.</p>
7
<p>В итоге, шаблон-наследник отрендерится так:</p>
7
<p>В итоге, шаблон-наследник отрендерится так:</p>
8
<p>Можно использовать столько уровней наследования, сколько необходимо. Один из распространенных способов использования наследования - трехуровневый подход:</p>
8
<p>Можно использовать столько уровней наследования, сколько необходимо. Один из распространенных способов использования наследования - трехуровневый подход:</p>
9
<ul><li>Создание<em>layout.html</em>шаблона, который содержит основной внешний вид сайта</li>
9
<ul><li>Создание<em>layout.html</em>шаблона, который содержит основной внешний вид сайта</li>
10
<li>Создание<em>layout_SECTIONNAME.html</em>шаблонов для каждого раздела сайта, например,<em>layout_course.html</em>,<em>layout_category.html</em>. Эти шаблоны расширяют<em>layout.html</em>и включают в себя стили для конкретных разделов</li>
10
<li>Создание<em>layout_SECTIONNAME.html</em>шаблонов для каждого раздела сайта, например,<em>layout_course.html</em>,<em>layout_category.html</em>. Эти шаблоны расширяют<em>layout.html</em>и включают в себя стили для конкретных разделов</li>
11
<li>Создание отдельного шаблона для каждого типа страницы, например, курса или статьи. Эти шаблоны расширяют соответствующий шаблон раздела</li>
11
<li>Создание отдельного шаблона для каждого типа страницы, например, курса или статьи. Эти шаблоны расширяют соответствующий шаблон раздела</li>
12
</ul><p>Такой подход максимизирует повторное использование кода и помогает добавлять элементы в области общего содержимого, например, навигацию по всему разделу. Также любые измения в родительских шаблонах отразятся и на наследниках. Так мы можем быть уверены, что поправив заголовок в базовом шаблоне, поправим его и на всех других страницах.</p>
12
</ul><p>Такой подход максимизирует повторное использование кода и помогает добавлять элементы в области общего содержимого, например, навигацию по всему разделу. Также любые измения в родительских шаблонах отразятся и на наследниках. Так мы можем быть уверены, что поправив заголовок в базовом шаблоне, поправим его и на всех других страницах.</p>