Трясогузка: отображение списка дочерних страниц внутри родительской страницы.

В CMS Wagtail я пытаюсь создать индексную страницу, которая будет отображать список всех ее дочерних страниц вместе с избранным изображением, связанным с каждой дочерней страницей.

Я создал эти две модели страниц в models.py:

class IndexPage(Page):
    intro = RichTextField(blank=True)

    content_panels = Page.content_panels + [
        FieldPanel('intro', classname='full'),
    ]

    subpage_types = ['myapp.ItemPage']


class ItemPage(Page):
    representative_image = models.ForeignKey(
        'wagtailimages.Image',
        null=True,
        blank=True,
        on_delete=models.SET_NULL,
        related_name='+'
    )

    body = RichTextField(blank=True)

    promote_panels = Page.promote_panels + [
        ImageChooserPanel('representative_image'),
    ]

    content_panels = Page.content_panels + [
        FieldPanel('body', classname='full'),
    ]

В шаблоне index_page.html я добавил следующий код:

<div class="intro">{{ self.intro|richtext }}</div>

{% for page in self.get_children %}
  {{ page.title }}
  {% image page.representative_image width-400 %}
{% endfor %}

Это отображает все заголовки дочерних страниц, но не изображения. Можно ли получить поля изображения для дочерних страниц?


person crumbletown    schedule 06.09.2015    source источник


Ответы (2)


Из примечаний к выпуску трясогузки версии 1.1:

Обычно операция, извлекающая набор запросов страниц (например, homepage.get_children()), возвращает их как базовые экземпляры Page, которые включают только основные данные страницы, такие как заголовок. Метод specific() (например, homepage.get_children().specific()) теперь позволяет извлекать их как наиболее конкретный тип, используя минимальное количество запросов.

Поэтому вам больше не нужна ваша пользовательская функция в предстоящем выпуске 1.1, и вы можете изменить свой шаблон на:

{% for page in self.get_children.specific %}
    {{ page.title }}
    {% image page.representative_image width-400 %}
{% endfor %}

По крайней мере, начиная с версии 0.8, с использованием specific также должно работать следующее:

{% for page in self.get_children %}
    {{ page.title }}
    {% image page.specific.representative_image width-400 %}
{% endfor %}
person timo.rieber    schedule 07.09.2015

Я нашел это решение: добавьте функцию child_pages в IndexPage:

class IndexPage(Page):
    intro = RichTextField(blank=True)

    def child_pages(self):
        return ItemPage.objects.live().child_of(self)

    content_panels = Page.content_panels + [
        FieldPanel('intro', classname='full'),
    ]

    subpage_types = ['myapp.ItemPage']

И это можно получить в шаблоне:

{% for page in self.child_pages %}
  {{ page.title }}
  {% image page.representative_image width-400 %}
{% endfor %}
person crumbletown    schedule 06.09.2015