Как мне сгенерировать список страниц в разделах для sidemenu в Wagtail?

#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 %}
  

Что это делает, так это:

  1. Перебирает дочерние страницы домашней страницы (помеченные как parent в этом цикле) и печатает Page title: {title_here}
  2. Затем он проверит наличие дочерних страниц каждой parent итерации цикла и распечатает - Child page title: {child_title}

Однако здесь есть ошибка. Это будет работать только с home_page.html шаблоном. Как только вы перейдете к /fruits/ , он попытается выполнить ту же логику, но на этот раз он подумает, Fruits что это новый HomePage

Есть 2 варианта, которые вы можете взять отсюда.

  1. Вы можете добавить пользовательский контекст на каждую страницу, чтобы убедиться, что вы всегда передаете HomePage и выполняете цикл через это. Это самый простой метод, и я покажу вам код ниже. Или,
  2. Вы можете создать систему меню, используя модель 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 %}