Почему похоже, что наследование шаблонов работает только с вложенными блоками? - PullRequest
0 голосов
/ 06 ноября 2019

Здравствуйте, у меня есть следующие 3 шаблона (упрощенно для целей этого поста):

1 - base.html:

//link stylesheet

{% block page_content %}
{% endblock %}

//add bootstrap, jQuery and run scripts

2 - base_app.html:

{% extends "base.html" %}

{% block page_content %}
//html here
{% endblock page_content %}

{% block page_app %}
{% endblock page_app %}

3 - base_app_main.html:

{% extends "base_app.html"%}

{% block page_app %}

//html i wanna display when I call render(request, 'base_app_main.html', context)

{% endblock page_app %}

Как и сейчас, когда я отображаю 3 - base_app_main.html, он не отображает детали внутри блока {% block page_app %}, однако, если я изменяю2 - base_app.html как показано ниже, он работает:

2 - MODIFIED base_app.html:

{% extends "base.html" %}

{% block page_content %}
//html here
{% block page_app %}
{% endblock page_app %}
{% endblock page_content %}

И я не могу понять, почему наследование шаблона не работает в первом случае и работает ввторой?

Документация или интерактивные учебники, которые я смог найти, не дают соответствующих примеров множественного наследования.

Ответы [ 3 ]

1 голос
/ 07 ноября 2019

Я думаю, что он описывает довольно ясно в документах о наследовании шаблона

Если вы используете {% extends%} в шаблоне, это должен быть первый тег шаблона вэтот шаблон. В противном случае наследование шаблонов не будет работать.

То, что вы сделали с первой попытки, - это, по сути, {% extend%} внутри {% extend%} в 1 шаблоне, результатом чего является основной шаблон, которыйВаш base.html имеет 2 расширенных тега. И это равно Template inheritance won’t work

0 голосов
/ 07 ноября 2019

Так что для любого, кто застрял в одной точке, это объяснение из онлайн-урока прояснило мне все:

В строке 1 {% extends "base.html"%}сообщает движку шаблонов Django, что текущий шаблон является дочерним шаблоном и наследуется от base.html. Это должна быть первая строка в дочернем шаблоне, иначе он не будет работать. Когда шаблонизатор встречает эту строку, он немедленно загружает родительский шаблон (то есть base.html) и затем заменяет блоки содержимого в родительском шаблоне на блоки содержимого с тем же именем, определенным в дочернем шаблоне.

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

, а затем заменили блоки содержимого в родительском шаблоне на блоки содержимого с тем же именем, определенные в дочернем шаблоне

Youувидим, что в первом случае, когда я рендерим base.html, я буду рендерить то, что находится в блоке {% block page_content %} его потомка, который является base_app.html. Таким образом, веб-страница, которую я получаю, не будет содержать ничего, относящегося к блоку {% block page_app %}.

Способ исправить это - сделать так, чтобы информация из {% block page_app %} в base_app_main.html всплывала до нашего base.html.

Для этого я нашел 2 решения:

1 - Вложение или изменение base_app.html на:

{% extends "base.html" %}

{% block page_content %}
//html here
{% block page_app %}
{% endblock page_app %}
{% endblock page_content %}

В этом случае, когда base.html отображается, он будетвозьмите всю информацию из блока {% block page_content %}, который теперь включает в себя блок {% block page_app %}, и успешно отрендерируйте все.

2 - измените base.html следующим образом:

//link stylesheet

{% block page_content %}
{% endblock page_content %}

{% block page_app %}
{% endblock page_app %}

//add bootstrap, jQuery and run scripts

Это будет явнопопросите base.html отобразить блок {% block page_app %} его потомка, а также работать.

-> Какой метод предпочтительнее? Я не уверена. Явный метод (2) кажется более простым, но он также означает, что если ваш base.html используется во многих различных проектах, он будет загроможден множеством блоков. Принимая во внимание, что неявный (1) метод лучше с точки зрения СУХОГО ... возможно, некоторые из вас, ребята, могут дать мне знать, что является «стандартным».

0 голосов
/ 06 ноября 2019

Родительский шаблон принимает содержимое только от дочернего элемента в пределах соответствующего {% block %}{% endblock %}. Ваш base.html имеет только блок page_content, поэтому другой блок в дочернем элементе не включен. Вы можете изменить base.html, чтобы он выглядел так:

//link stylesheet

{% block page_content %}
{% endblock %}

{% block page_app %}
{% endblock page_app %}
//add bootstrap, jQuery and run scripts
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...