8

I have the following code to get the child pages of the current one:

{% for subpage in self.get_children %}
    ...
{% endfor %}

This is used, for example, to show a gallery of images (each children page have an image).

However, this works fine when only I have one type of children, but, when I try to add another child page (for example to show testimonials), the code above doesn't filter for children type ..so it shows all childs.

I want to know if there is another way to make this work or if my approach is wrong (the use of children pages).

Any help would be appreciated :-)

Giovanni Benussi
  • 3,102
  • 2
  • 28
  • 30

2 Answers2

16

It's often easier to do these kinds of queries in Python code, rather than inside the template. Wagtail page objects provide a get_context method where you can set up additional variables to be passed into the template:

class GalleryIndexPage(Page):
    # ... field definitions here ...

    def get_context(self, request):
        context = super(BlogIndexPage, self).get_context(request)
        context['image_pages'] = self.get_children().type(ImagePage)
        return context

In this code, type is one of the methods Wagtail provides for filtering a queryset - see Page QuerySet reference for the full list.

With this method defined, you can then access the variable image_pages within your template:

{% for subpage in image_pages %}
    ...
{% endfor %}
J. Ghyllebert
  • 2,009
  • 1
  • 29
  • 35
gasman
  • 23,691
  • 1
  • 38
  • 56
3

There are two ways you can solve this.

First one is to filter your subpages in your view by type, e.g.:

page = Page.objects.get(slug='current-page')
pages_with_images = Page.objects.filter(parent=page, type='image')
pages_with_testimonials = Page.objects.filter(parent=page, type='testimonial')

Then, in your template, you can separately iterate through pages_with_images and pages_with_testimonials:

{% for subpage in pages_with_images %}
    ...
{% endfor %}

{% for subpage in pages_with_testimonials %}
    ...
{% endfor %}

The second solution is to check type of the subpage in your template:

{% for subpage in self.get_children %}
    {% if subpage.type == 'image' %}
        ...
    {% endif %}
{% endfor %}
ozren1983
  • 1,891
  • 1
  • 16
  • 34