Отобразить переменную родительской страницы на дочерней странице с шаблоном — wagtail / django

#django #django-templates #wagtail

#django #django-шаблоны #wagtail

Вопрос:

Я пытался найти решение, но, вероятно, пропустил его, вероятно, потому, что я не уверен, что именно спросить.

Я новичок в Wagtail / Django. Как я могу сделать переменные с родительской страницы видимыми на дочерней странице?

Я пытаюсь создать страницу с заголовком, содержимым и нижним колонтитулом. Я вложил их внутрь {% block name_of_section %} . Теперь у меня есть дочерняя страница (на самом деле внук, но неважно), шаблон которой состоит только из:

 {% extends main_page.html %}
{% load wagtailcore_tags wagtailimages_tags static wagtailuserbar %}

{% block content%}
   {{ page.photo }}
   {{ page.article }}
{% endblock %}
  

и шаблон главной страницы (разумеется, усеченный):

 {% load wagtailcore_tags wagtailimages_tags static wagtailuserbar %}
htmlcode
{% block header %}some stuff here{% endblock %}
{% block content %}stuff to be replaced in child pages here{% endblock%}
{% block footer %}{{ page.address }} {{ page.links }} {{% endblock %}}
finishing html code here
  

Теперь проблема, с которой я сталкиваюсь, заключается в том, что при загрузке дочерней страницы верхний, содержимое и нижний колонтитулы отображаются почти нормально. Исключением являются адреса переменных и ссылки из нижнего колонтитула. Я предполагаю, что это потому, что она передается на дочернюю страницу по-прежнему как {{ page.address }} и, конечно, у дочерней страницы нет адреса, поэтому результатом является пустая строка.

Мой обходной путь заключался в том, чтобы (вероятно, очень ошибочно) сделать это в models.py :

 def address(self):
    getattr(HomePage.objects.first(), 'address')
    return address
  

Таким образом, при загрузке домашней страницы шаблон загружает переменную, а при загрузке дочерней страницы шаблон вызывает метод, который (также, вероятно, неправильным способом, но работает) извлекает значение переменной.

Но это кажется неправильным. Каков правильный способ?

Ответ №1:

Похоже, address на самом деле это не поле, которое принадлежит домашней странице, а глобальное свойство сайта в целом. Если это так, то лучше перенести ее в модель настроек сайта — таким образом, вы можете легко сделать ее доступной на всех страницах, используя один и тот же базовый шаблон.

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

Комментарии:

1. Хорошо, это звучит разумно для адреса. Но что, если это что-то, что более подвержено изменениям, и я хотел бы, чтобы его можно было легко редактировать из среды администратора wagtail. Сделайте это… Я не знаю… ‘Шутка недели’ на определенной странице и ее дочерних элементах, редактируемая редакторами, не требующая участия администраторов сайта. Или лучший пример. Ссылки на последние 3 опубликованные статьи находятся в нижнем колонтитуле. Их нельзя редактировать вручную каждый раз, когда вы добавляете ее, поэтому, я думаю, вопрос остается в силе?

2. В этом случае я бы выбрал тег шаблона включения — обновил ответ с дополнительной информацией.