8

現在のページの子ページを取得する次のコードがあります。

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

これは、たとえば、画像のギャラリーを表示するために使用されます (各子ページには画像があります)。

ただし、これは 1 種類の子しかない場合は正常に機能しますが、別の子ページを追加しようとすると (たとえば、証言を表示するため)、上記のコードは子の種類をフィルター処理しません..したがって、すべての子が表示されます。

これを機能させる別の方法があるかどうか、または私のアプローチが間違っているかどうか (子ページの使用) を知りたいです。

どんな助けでも大歓迎です:-)

4

2 に答える 2

16

多くの場合、これらの種類のクエリは、テンプレート内ではなく Python コードで実行する方が簡単です。Wagtail ページ オブジェクトは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は、クエリセットをフィルタリングするために Wagtail が提供するメソッドの 1 つです。完全なリストについては、Page QuerySet リファレンスを参照してください。

このメソッドを定義すると、image_pagesテンプレート内の変数にアクセスできます。

{% for subpage in image_pages %}
    ...
{% endfor %}
于 2016-05-19T22:40:14.527 に答える
3

これを解決するには 2 つの方法があります。

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

2 番目の解決策は、テンプレートのサブページのタイプを確認することです。

{% for subpage in self.get_children %}
    {% if subpage.type == 'image' %}
        ...
    {% endif %}
{% endfor %}
于 2016-05-19T22:40:41.133 に答える