#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. В этом случае я бы выбрал тег шаблона включения — обновил ответ с дополнительной информацией.