В Django, Проблема с {{block.super}}, как избежать дублирования «блока» в нескольких файлах шаблонов? - PullRequest
1 голос
/ 21 ноября 2008

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

Python 2.5.2, Django 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-файлах?

Ответы [ 2 ]

4 голосов
/ 21 ноября 2008

Django предлагает что-то вроде ВКЛЮЧИТЬ (...)

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

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

{% include 'foo.html' %}
2 голосов
/ 22 ноября 2008

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

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

{% show_item user.favorite_item %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...