matousc
matousc

Reputation: 3977

Wagtail ListBlock - how to access first (any) element in template?

I have ListBlock called imagesin Wagtail. It works well. If I put

{{ page.images }}

in a template, it render the html code like:

<ul>
  <li>item1</li>
  <li>item2</li> 
</ul>

But I am unable to find out how to get the first item of the list isolated. Or at least how to iterate over the list manually.

I am pretty sure the solution is simple, however I am unable to google it, find in the docs, or understand from the wagtail source.

Upvotes: 2

Views: 2341

Answers (1)

gasman
gasman

Reputation: 25292

You haven't shared your model definition, but I'm going to guess it's something like:

class MyPage(Page):
    images = StreamField([
        ('image_list', blocks.ListBlock(blocks.ImageChooserBlock)),
    ])

Using the standard pattern for manually looping over a StreamField value as shown in the Wagtail docs, this would be:

{% for block in page.images %}
    {% if block.block_type == 'image_list' %}
        {# at this point block.value gives you the images as an ordinary Python list #}

        {# Output the first image using block.value.0: #}
        {% image block.value.0 width-800 %}

        {# Or loop over block.value manually with a 'for' loop #}
        <ul>
            {% for img in block.value %}
                <li>{% image img width-800 %}</li>
            {% endfor %}
        </ul>

    {% elif block.block_type == 'some_other_block' %}
        ...
    {% else %}
        ...
    {% endif %}
{% endfor %}

In this case, you probably only have one block type defined (image_list), so the if block.block_type == 'image_list' can be left out; but you'll still need the outer {% for block in page.images %}, because StreamField is still defined as a list of blocks, even if you only have one item in that list.

Upvotes: 6

Related Questions