Что лучший способ состоит в том, чтобы копировать данные в шаблоне django? [дубликат]

Знакомство с алгоритмами/структурами данных я использую и/или быстрый анализ взгляда итеративного вложения. Трудность состоит в том при вызове библиотечной функции, возможно многократно - можно часто быть не уверены в том, вызываете ли Вы функцию излишне время от времени или какую реализацию они используют. Возможно, библиотечные функции должны иметь меру по сложности/эффективности, ли это быть Большим O или некоторой другой метрикой, которая доступна в документации или даже IntelliSense.

15
задан Nope 24 July 2009 в 18:15
поделиться

4 ответа

Похоже, ваш макет прочный. У вас есть база . 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 - задать вопрос»

8
ответ дан 1 December 2019 в 01:00
поделиться
{% extends "base.html" %}

{% with "Entry Title" as title %}
    {% block title %}{{ title }}{% endblock %}
    {% block h1 %}{{ title }}{% endblock %}
{% endwith %}

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

10
ответ дан 1 December 2019 в 01:00
поделиться

Передайте переменную вашему шаблону, например название. Затем замените основную надпись на {{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

1
ответ дан 1 December 2019 в 01:00
поделиться

В 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.

21
ответ дан 1 December 2019 в 01:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: