2016-05-19 3 views
2

У меня есть следующий код, чтобы получить дочерние страницы текущего:Получить дочерние страницы указанного типа в трясогузке (или Django)

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

Это используется, например, чтобы показать галерею изображений (на каждой странице детей есть изображение).

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

Я хочу знать, есть ли другой способ сделать эту работу или если мой подход неверен (использование детских страниц).

Любая помощь будет оценена :-)

ответ

5

Это часто легче сделать эти виды запросов в коде Python, а не внутри шаблона. Объекты трясогузки страниц обеспечивают get_context способ, в котором вы можете настроить дополнительные переменные должны быть переданы в шаблон:

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 

В этом коде type это один из методов трясогузка обеспечивает для фильтрации QuerySet - см Page QuerySet reference для полного список.

С помощью этого метода, определенного, вы можете получить доступ к переменной image_pages внутри шаблона:

{% for subpage in image_pages %} 
    ... 
{% endfor %} 
+0

Thank s, это работает и выглядит хорошо :-)! –

1

Есть два способа решить эту проблему.

Сначала один, чтобы отфильтровать подстраниц по вашему мнению, по типу, например:

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') 

Затем, в шаблоне, вы можете отдельно перебирать pages_with_images и pages_with_testimonials:

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

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

во второй решение должно проверить тип подстраницы в вашем шаблоне:

{% for subpage in self.get_children %} 
    {% if subpage.type == 'image' %} 
     ... 
    {% endif %} 
{% endfor %} 
+1

Это выглядит хорошо, спасибо :-) .. но я думаю, что ответ @gasman более полезен. –

Смежные вопросы