如何在StreamField的TableBlock模板中添加“标题”标签?

时间:2019-04-17 18:36:52

标签: wagtail wagtail-streamfield

我想在StreamField中为使用TableBlock创建的表添加<caption>标记,以使表更易于访问且在语义上正确。现在,默认模板没有该标签。我不确定应该如何自定义table.html模板(从默认模板开始,如果我为表块创建自定义类以添加标题,则不确定如何呈现表。 <caption>必须是<table>的第一个孩子,这就是为什么我需要修改模板。有人做过吗?

<table>
    <caption>Example Caption</caption> <--- Need this here
    <thead>
        <th>Header col 1</th>
        <th>Header col 2</th>
    </thead>
    <tbody>
    <tr>
        <td>Cell col 1</td>
        <td>Cell col 2</td>
    </tr>
    </tbody>
</table>

1 个答案:

答案 0 :(得分:0)

看看下面的代码。

TableBlock.py

class TableHead(blocks.StructBlock):
    table_head_text = blocks.ListBlock(blocks.CharBlock(max_length=120))

class TableRow(blocks.StructBlock):
    table_row_text = blocks.ListBlock(blocks.CharBlock(max_length=120))

class TableBlock(blocks.StructBlock):
    caption_text = blocks.CharBlock(max_length=120)
    table_head = TableHead()
    table_rows = blocks.ListBlock(TableRow())

    class Meta:
        template = 'wagtail_blocks/table.html'

您会注意到,我已经在'Meta'类中设置了'template'属性,因此您也必须创建该文件。

table.html

{% load wagtailcore_tags %}

<table>
    <caption>{{ value.caption_text }}</caption>
    <thead>
    {% for header_text in value.table_head.table_head_text %}
        <th>{{ header_text }}</th>
    {% endfor %}
    </thead>
    <tbody>
    {% for table_row in value.table_rows %}
        <tr>
            {% for table_row_text in table_row.table_row_text %}
                <td>{{ table_row_text }}</td>
            {% endfor %}
        </tr>
    {% endfor %}
    </tbody>
</table>

最后,您可以在这样的任何页面中轻松使用新的TableBlock

body = StreamField([
    ('table', TableBlock()),
])