Python 通过Wagtail Streamfield项循环

Python 通过Wagtail Streamfield项循环,python,django,templates,wagtail,wagtail-streamfield,Python,Django,Templates,Wagtail,Wagtail Streamfield,我正在尝试创建一个索引页,其中包含指向Wagtail中多个照片库的链接。GalleryIndexPage模型如下所示: class GalleryIndexPage(Page): subpage_types = ['home.GalleryPage'] gallery_thumb = StreamField ([ ('cover_photo', ImageChooserBlock()), ('title', blocks.CharBlock()),

我正在尝试创建一个索引页,其中包含指向Wagtail中多个照片库的链接。GalleryIndexPage模型如下所示:

class GalleryIndexPage(Page):
  subpage_types = ['home.GalleryPage']

  gallery_thumb = StreamField ([
      ('cover_photo', ImageChooserBlock()),
      ('title', blocks.CharBlock()),
      ('link', URLBlock()),
  ])

  content_panels = Page.content_panels + [
      StreamFieldPanel('gallery_thumb'),
  ]
('gallery_item', blocks.StructBlock([
    ('title', blocks.CharBlock()),
    ('link', blocks.URLBlock()),
    ('image', ImageChooserBlock()),
], icon='xyz'))
我很难在每套数据周围使用“gallery item”类将其渲染到模板中。我意识到它目前正在循环并向Streamfield内的每个块添加一类“gallery item”,而不是围绕整个Streamfield集合。以下是我的模板代码:

<div class="photo-gallery">
{% for block in self.gallery_thumb %}
<div class="gallery-item">
  {% if block.block_type == 'cover_photo' %}
  <div class="thumb">
    {% image block.value fill-200x150 %}
  </div>
  {% endif %}
  {% if block.block_type == 'title' %}
  <div class="title">
    <p>{{ block.value }}</p>
  </div>
  {% endif %}
  {% if block.block_type == 'link' %}
  <div class="link">
    <a href="{{ block.value }}">View Gallery</a>
  </div>
  {% endif %}
</div>
{% endfor %}
我不确定如何在我的模板中访问这些值?以下是我到目前为止的情况:

  <div class="photo-gallery">
    {% for block in self.gallery %}
    <div class="gallery-item">
      <div class="thumb">
        {% image self.cover_photo width-200 %}
      </div>
      <div class="title">
        <p>{{ self.title }}</p>
      </div>
      <div class="link">
        <a href="{{ self.link }}">>> View Gallery</a>
      </div>
    </div>
    {% endfor %}
  </div> 

{self.gallery%中的块的%s}
{%image self.cover_照片宽度-200%}
{{self.title}

{%endfor%}
看起来您想要的是一个由图像、标题和链接组成的单一图库项目块。可以通过从更简单的块类型中创建自己的块类型来实现这一点。看

你可以这样做:

class GalleryIndexPage(Page):
  subpage_types = ['home.GalleryPage']

  gallery_thumb = StreamField ([
      ('cover_photo', ImageChooserBlock()),
      ('title', blocks.CharBlock()),
      ('link', URLBlock()),
  ])

  content_panels = Page.content_panels + [
      StreamFieldPanel('gallery_thumb'),
  ]
('gallery_item', blocks.StructBlock([
    ('title', blocks.CharBlock()),
    ('link', blocks.URLBlock()),
    ('image', ImageChooserBlock()),
], icon='xyz'))
您还可以将其创建为Python类,这是我通常喜欢做的,我在上面链接的部分的最后一部分介绍了这一点

您可以为此块创建自己的模板

在模板中,每个块都有两个属性,
value
block\u type
。例如,您可以使用
{{self.title.value}
访问
标题


请参见

您想要的似乎是一个由图像、标题和链接组成的单一图库项目块。可以通过从更简单的块类型中创建自己的块类型来实现这一点。看

你可以这样做:

class GalleryIndexPage(Page):
  subpage_types = ['home.GalleryPage']

  gallery_thumb = StreamField ([
      ('cover_photo', ImageChooserBlock()),
      ('title', blocks.CharBlock()),
      ('link', URLBlock()),
  ])

  content_panels = Page.content_panels + [
      StreamFieldPanel('gallery_thumb'),
  ]
('gallery_item', blocks.StructBlock([
    ('title', blocks.CharBlock()),
    ('link', blocks.URLBlock()),
    ('image', ImageChooserBlock()),
], icon='xyz'))
您还可以将其创建为Python类,这是我通常喜欢做的,我在上面链接的部分的最后一部分介绍了这一点

您可以为此块创建自己的模板

在模板中,每个块都有两个属性,
value
block\u type
。例如,您可以使用
{{self.title.value}
访问
标题


请参见

我可以使用以下代码访问模板中StructBlock的值:

<div class="photo-gallery">
{% for block in self.gallery %}
<div class="gallery-item">
  <div class="thumb">
    {% image block.value.cover_photo fill-200x150 %}
  </div>
  <div class="title">
    <p>{{ block.value.title }}</p>
  </div>
  <div class="link">
    <a href="{{ block.value.link }}">>>View Gallery</a>
  </div>
</div>
{% endfor %}

{self.gallery%中的块的%s}
{%image block.value.cover_照片填充-200x150%}
{{block.value.title}

{%endfor%}


非常感谢你的帮助

我可以使用以下代码访问模板中StructBlock的值:

<div class="photo-gallery">
{% for block in self.gallery %}
<div class="gallery-item">
  <div class="thumb">
    {% image block.value.cover_photo fill-200x150 %}
  </div>
  <div class="title">
    <p>{{ block.value.title }}</p>
  </div>
  <div class="link">
    <a href="{{ block.value.link }}">>>View Gallery</a>
  </div>
</div>
{% endfor %}

{self.gallery%中的块的%s}
{%image block.value.cover_照片填充-200x150%}
{{block.value.title}

{%endfor%}


非常感谢你的帮助

我已经使用了你上面的建议,这在管理中似乎非常有效,但是我在访问模板中的这些值时遇到了问题。上面更新的问题显示了我的尝试。谢谢添加了更多信息,我没有测试,但我很确定您只是缺少了
.value
属性,如果它不适合您,请告诉我。是的,我只是缺少了
.value
属性。再次感谢您的帮助。是否有办法限制为仅12个最新图像?@kbdev在模板中,您可能可以使用内置过滤器
切片
获取列表的第一个或最后n个项目。我已经使用了你上面的建议,这在管理中似乎非常有效,但是我在访问模板中的这些值时遇到了问题。上面更新的问题显示了我的尝试。谢谢添加了更多信息,我没有测试,但我很确定您只是缺少了
.value
属性,如果它不适合您,请告诉我。是的,我只是缺少了
.value
属性。再次感谢您的帮助。是否有办法限制为仅12个最新图像?@kbdev在模板中,您可能可以使用内置过滤器
切片
获取列表的第一个或最后n个项目。