Знакомство с алгоритмами/структурами данных я использую и/или быстрый анализ взгляда итеративного вложения. Трудность состоит в том при вызове библиотечной функции, возможно многократно - можно часто быть не уверены в том, вызываете ли Вы функцию излишне время от времени или какую реализацию они используют. Возможно, библиотечные функции должны иметь меру по сложности/эффективности, ли это быть Большим O или некоторой другой метрикой, которая доступна в документации или даже IntelliSense.
Похоже, ваш макет прочный. У вас есть база . 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
package)
Также может пригодиться {{block.super}}
. Это позволит вам объединить содержимое родительского блока с дополнительным содержимым дочернего. Таким образом, вы можете определить заголовок типа «Stackoverflow.com» в базе и установить
{% block title %}{{ block.super }} - Ask a Question{% endblock %}
в дочернем элементе, чтобы получить заголовок типа «Stackoverflow.com - задать вопрос»
{% extends "base.html" %}
{% with "Entry Title" as title %}
{% block title %}{{ title }}{% endblock %}
{% block h1 %}{{ title }}{% endblock %}
{% endwith %}
Это может сработать, если вы действительно беспокоитесь о том, чтобы убрать title
из просмотров и не повторяться.
Передайте переменную вашему шаблону, например название. Затем замените основную надпись на {{title}}. Чтобы передать это в свой шаблон в вашем представлении, убедитесь, что у вас есть:
def myview(request):
t = loader.get_template("mypage.html")
title = "My Title"
c = Context({"title" : title })
HttpResponse(t.render(c))
Затем в вашем шаблоне у вас будет:
<html>
<head>
<title>{{ title }}</title>
</head>
<body>
<h1>{{ title }}}</h1>
</body>
См. Также: Как повторить «блок» в шаблоне django
В base.html:
<head>
<title>{% block title %}{% endblock %}</title>
</head>
<body>
<h1>{% block h1 %}{% endblock %}</h1>
</body>
Затем создайте еще один «базовый» слой поверх того, который называется content_base.html (или что-то в этом роде):
{% extends "base.html" %}
{% block h1 %}{% block title %}{% endblock %}{% endblock %}
Теперь пусть все ваши другие шаблоны расширяют content_base.html. Все, что вы помещаете в блок «title» во всех ваших шаблонах, войдет в блоки «title» и «h1» в base.html.