В Django проблема с {{ block.super }}, как мне избежать дублирования «блока» в нескольких файлах шаблонов?

Для 2 файлов дочерних шаблонов, наследующих блок, {{ block.super }} не разрешается

Python 2.5.2, Джанго 1.0, Windows XP SP3

Пример скелетного кода для задействованных файлов:

  1. base.html
  2. item_base.html
  3. show_info_for_all_items.html
  4. show_info_for_single_item.html

ФАЙЛ : base.html

{% block content %}
{% endblock %}

ФАЙЛ : item_base.html

{% extends "base.html" %}
{% block item_info %}   
    Item : {{ item.name }}<br/>
    Price : {{ item.price }}<br/>   
{% endblock %}

ФАЙЛ : show_info_for_all_items.html

{% extends "item_base.html" %}
{% block content %}
    <h1>info on all items</h1>
    <hr/>
    {% for item in items %}
        {% block item_info %}
            {{ block.super }}
        {% endblock %}
        <hr/>
    {% endfor %}
{% endblock %}

ФАЙЛ : show_info_for_single_item.html

{% extends "item_base.html" %}
{% block content %}
    <h1>info on single item</h1>    
    {% block item_info %}
        {{ block.super }}
    {% endblock %}  
{% endblock %}

show_info_for_all_items.html показывает список элементов вместе с информацией о каждом элементе.

show_info_for_single_item.html показывает один элемент с информацией о нем.

show_info_for_all_items.html и show_info_for_single_item.html используют один и тот же код для отображения информации об элементе, поэтому я переместил его из item_base.html в block item_info.

но {{ block.super }} в show_info_for_all_items.html и show_info_for_single_item.html не работает. {{ block.super }} разрешается как пустое.

Если я верну код из block item_info в item_base.html в show_info_for_all_items.html и show_info_for_single_item.html, он сработает, но тогда мне придется дублировать тот же код block item_info в 2 файлах.

Если проблема block.super не может быть решена, предлагает ли Django что-то вроде INCLUDE => {% INCLUDE "item_base.html" %}, чтобы можно было включить блоки из файла шаблона (вместо extends)

Как избежать дублирования block item_info в обоих html-файлах?


person X10    schedule 21.11.2008    source источник
comment
Если бы вы загуглили django+include, вы могли бы задать вопрос и ответить на него за долю времени, которое потребовалось бы для его ввода.   -  person Peter Rowell    schedule 22.11.2008
comment
Принимайте тех, кто не работает в Google: meta.stackexchange.com/questions/ 5280/embrace-the-non-googlers и как нам поступать с вопросами Google? : meta.stackexchange. ком/вопросы/8724/   -  person X10    schedule 05.01.2013
comment
Нет, я не буду поддерживать вампиров-помощников и не согласен с теми, кто поощряет их здесь. SO не может и, IMNSHO, не должен пытаться заменить высококачественную документацию такого проекта, как Django. Думать, что ТАК можно и нужно, — это высокомерие, простое и понятное.   -  person Peter Rowell    schedule 06.01.2013
comment
@PeterRowell - я согласен, что вампирам-помощникам (хороший термин) следует дать по носу, но мне нравится, что ОП какое-то время гуглил этот вопрос, прежде чем понял, что include было ключевым словом, которое дало бы мне результат. На самом деле его нет в документации по расширению шаблона здесь   -  person Jamie Marshall    schedule 21.01.2021


Ответы (2)


Предлагает ли Django что-то вроде INCLUDE (...)

Да! Просто взгляните на документацию: include

Поместите общий блок кода в foo.html, а затем в каждом шаблоне:

{% include 'foo.html' %}
person David Arcos    schedule 21.11.2008

В дополнение к тегу include, упомянутому DZPM, вы можете подумать о написании настраиваемый тег включения.

Основное преимущество в этом случае заключается в том, что в вызывающем шаблоне не обязательно использовать те же имена переменных, что и во включенном шаблоне. Вы можете показать элемент, доступ к которому осуществляется откуда-то, кроме переменной с именем «элемент»:

{% show_item user.favorite_item %}
person Matthew Marshall    schedule 22.11.2008