Похоже, ваш макет прочный. У вас есть 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 - Задайте вопрос"
person
sixthgear
schedule
24.07.2009