Ответ 1
Похоже, ваш макет прочен. У вас есть шаблон base.html
, который определяет базовую структуру и внешний макет для каждой страницы вашего приложения. У вас также есть base_object.html
, который расширяет этот шаблон.
Вы хотите, чтобы каждая страница имела уникальный заголовок и соответствующий h1 (я думаю). Лучший способ сделать это - определить два отдельных блока в шаблоне base.html.
<html>
<head>
<title>{% block title %}Default Title{% endblock %}</title>
</head>
<body>
<h1>{% block h1 %}{% endblock %}</h1>
</body>
</html>
В ваших дочерних шаблонах вам необходимо переопределить их оба, если вы хотите, чтобы они были идентичными. Я знаю, что вы чувствуете, что это противоречит интуиции, но это необходимо из-за того, как наследование шаблона обрабатывается в Django.
Источник: Язык шаблонов Django
Наконец, обратите внимание, что вы не можете определить несколько тегов
{% block %}
с тем же именем в одном шаблоне. Это ограничение существует, потому что блок-тег работает в "обоих" направлениях. То есть блок-тег не просто предоставляет отверстие для заполнения - он также определяет контент, заполняющий отверстие в родительском элементе. Если в шаблоне было два одинаково названных тега{% block %}
, этот родитель шаблона не знал бы, какой из содержимого блоков использовать.
Дети выглядят так:
{% extends "base.html" %}
{% block title %}Title{% endblock %}
{% block h1 %}Title{% endblock %}
Если это вас беспокоит, вы должны установить заголовок из представления для каждого объекта в качестве переменной шаблона.
{% block title %}{{ title }}{% endblock %}
{% block h1 %}{{ title }}{% endblock %}
Django стремится сохранить как можно больше логики из уровня шаблона. Часто название определяется динамически из базы данных, поэтому слой представления является идеальным местом для извлечения и установки этой информации. Вы можете оставить заголовок пустым, если хотите отложить до заголовка по умолчанию (возможно, в base.html
, или вы можете захватить имя сайта из пакета django.contrib.sites
)
Также может понадобиться {{ block.super }}
. Это позволит вам комбинировать содержимое родительского блока с дополнительным содержимым от дочернего элемента. Таким образом, вы можете определить заголовок типа "Stackoverflow.com" в базе и установить
{% block title %}{{ block.super }} - Ask a Question{% endblock %}
у ребенка, чтобы получить заголовок типа "Stackoverflow.com - Задайте вопрос"