#django-models #django-templates #wagtail
#django-модели #django-шаблоны #wagtail
Вопрос:
Я настоящий новичок в Wagtail. Как мне сгенерировать список страниц в разделах для sidemenu в Wagtail?
В качестве примера у меня есть следующая структура сайта:
home/
fruits/
apples/
oranges/
grapes/
vegetables/
kale/
spinach/
cabbage/
home
имеет HomePage
тип, использующий home_page.html
шаблон , и все подстраницы имеют ContentPage
тип, использующий content_page.html
шаблон.
Я хочу создать боковое меню для всех страниц содержимого, перечисляя все страницы в их группах. Например, этот список:
Fruits
Apples
Oranges
Grapes
должно быть sidemenu для страниц fruits
, apple
, oranges
и grapes
.
page.get_children
в шаблоне выводится список только в том случае, если на странице есть дочерние элементы, поэтому в данном случае просто fruits
и vegetables
.
Как бы мне создать это sidemenu?
Примеры в документации Wagtail, похоже, подразумевают, что у меня не может быть просто общего типа контента, такого как ContentPage
, чтобы иметь список того типа, который я хочу, это правда?
Большое спасибо!
Ответ №1:
добро пожаловать в Wagtail!
Как и в большинстве случаев в веб-разработке, есть несколько способов сделать это. Самое простое, что можно понять, когда вы только начинаете, — это проделать все это через шаблон. Итак, в вашем home_page.html
вы могли бы иметь:
{% for parent in page.get_children %}
Page title: {{ parent.title }} <br />
{% if parent.get_children.count %}
{% for child in parent.get_children %}
- Child page title: {{ child.title }}<br/>
{% endfor %}
{% endif %}
{% endfor %}
Что это делает, так это:
- Перебирает дочерние страницы домашней страницы (помеченные как
parent
в этом цикле) и печатаетPage title: {title_here}
- Затем он проверит наличие дочерних страниц каждой
parent
итерации цикла и распечатает- Child page title: {child_title}
Однако здесь есть ошибка. Это будет работать только с home_page.html
шаблоном. Как только вы перейдете к /fruits/
, он попытается выполнить ту же логику, но на этот раз он подумает, Fruits
что это новый HomePage
Есть 2 варианта, которые вы можете взять отсюда.
- Вы можете добавить пользовательский контекст на каждую страницу, чтобы убедиться, что вы всегда передаете
HomePage
и выполняете цикл через это. Это самый простой метод, и я покажу вам код ниже. Или, - Вы можете создать систему меню, используя модель Django и зарегистрировав класс Menu как фрагмент Wagtail. У меня есть видео со всем доступным исходным кодом, если вы хотите глубже погрузиться в Wagtail (https://www.youtube.com/watch?v=Y8a9ROUUJXU)
Чтобы добавить HomePage
к каждому ContentPage
, вы можете добавить его в контекст каждой страницы, вот так:
class ContentPage(Page):
# Fields here
def get_context(self, request, *args, **kwargs):
"""Adding HomePage to your page context."""
context = super().get_context(request, *args, **kwargs)
context["home_page"] = HomePage.objects.first()
return context
И в ваших шаблонах вы бы написали:
{% for child_page in home_page.get_children %}
Page title: {{ child_page.title }} <br />
{% if child_page.get_children.count %}
{% for grandchild_page in child_page.get_children %}
- Child page title: {{ grandchild_page.title }}<br/>
{% endfor %}
{% endif %}
{% endfor %}
Редактировать: Если вы находитесь на странице внука, лайкаете /fruits/apples/
и хотите отобразить заголовок родительской страницы и все страницы-братья (т. Е. /fruits/oranges/
и /fruits/grapes/
) вы можете перебирать родственные страницы. Что-то вроде этого должно работать:
<!-- On `/fruits/` this will be the Home Page title. On `/fruits/apples/` this will be the Fruits page title. -->
<h2>{{ self.get_parent.title }}<h2>
{% for sibling in self.get_siblings %}
<a href="{{ sibling.url }}">{{ sibling.title }}</a>
{% endfor %}