Django models 无法访问模板内Streamfield中嵌套块的值

Django models 无法访问模板内Streamfield中嵌套块的值,django-models,wagtail,wagtail-streamfield,Django Models,Wagtail,Wagtail Streamfield,我是Wagtail新手,但我已经完成了家庭作业,阅读了文档,并在网上搜索了其他参考资料,但我无法理解为什么我无法成功地循环并呈现输入到Steamfield中的各种块中的值。我在主页模板和块模板中都尝试过 这是我的模型(议程项目的模板现在被注释掉了): 当我有这样一个最基本的模板时,在编辑器中发布页面时输入的所有值都会被呈现,但前面有块的名称。因此,在这个基本模板中: {% for block in self.agenda %} {{ block.value }} {% endfor %

我是Wagtail新手,但我已经完成了家庭作业,阅读了文档,并在网上搜索了其他参考资料,但我无法理解为什么我无法成功地循环并呈现输入到Steamfield中的各种块中的值。我在主页模板和块模板中都尝试过

这是我的模型(议程项目的模板现在被注释掉了):

当我有这样一个最基本的模板时,在编辑器中发布页面时输入的所有值都会被呈现,但前面有块的名称。因此,在这个基本模板中:

{% for block in self.agenda %}
     {{ block.value }}
{% endfor %} 
如果我试图单独访问其中的值,则什么也得不到。下面只是一个示例,但我尝试了许多其他语法组合,包括为名为“agenda_item”的块使用单独的模板,但没有效果:

{% if block.block_type == 'item_title' %}

           <h2>{{ block.value }}<h2>

      {% endif %}

按照当前编写代码的方式,顶级块的类型始终为
agenda\u item
,因此在循环时需要考虑这一点:

{% for block in self.agenda %}
    {% if block.block_type == 'agenda_item' %} {# will always be true, but included here for clarity #}
        {% for subblock in block.value %}
            {% if subblock.block_type == 'item_title' %}
                <h2>{{ subblock.value }}</h2>
            {% elif subblock.block_type == 'item_content' %}
                rendering for item_content...
            {% endif %}
        {% endfor %}
    {% endif %}
{% endfor %}

(或者您是否打算将议程项目改为结构块?)

我想我确实希望议程项目成为结构块,这样我就可以列出一个列表。我将尝试使用这种子块语法或删除一个级别,Wagtail文档中没有任何地方写过subblock这个词,我可以发现“subblock”不是一个Wagtail概念-这只是我在代码示例中选择的变量名,以将其与顶级块区分开来。此解决方案返回item_title值,但是我无法正确地迭代structblock:item_内容,它得到这个呈现:[StructValue([('item_text','…等等,通过使用相同的for和if语法,有什么想法吗?我必须使用这个语法来访问structblock值,我想知道什么时候需要和不需要这个:{block.bound_blocks.item_text.render}通过在主“议程项目”流块中使“项目标题”成为可用块,每次在编辑器中单击+时它都变为可用。我需要每个新议程项目只显示一次,然后在该项目中单击+时只显示其他块
agenda = StreamField([
    ('agenda_item', blocks.StreamBlock([
        ('item_title', blocks.TextBlock()),
        ('item_text', blocks.TextBlock()),
        ('mtg_doc', blocks.StructBlock([
            ('mtg_doc_upload', DocumentChooserBlock(required=True)),
            ('submitted_late', blocks.BooleanBlock(required=False, help_text='Submitted Late')),
            ('heldover', blocks.BooleanBlock(required=False, help_text='Held Over')),
            ('heldover_from', blocks.DateBlock(required=False, help_text="Held Over From")),
        ])),
        ('item_audio', DocumentChooserBlock(required=False)),
    ]))
])




content_panels = Page.content_panels + [
    FieldPanel('author'),
    FieldPanel('date'),
    FieldPanel('mtg_date'),
    FieldPanel('mtg_time'),
    StreamFieldPanel('mtg_media'),
    StreamFieldPanel('agenda'),

]
{% for block in self.agenda %}
    {% if block.block_type == 'agenda_item' %} {# will always be true, but included here for clarity #}
        {% for subblock in block.value %}
            {% if subblock.block_type == 'item_title' %}
                <h2>{{ subblock.value }}</h2>
            {% elif subblock.block_type == 'item_content' %}
                rendering for item_content...
            {% endif %}
        {% endfor %}
    {% endif %}
{% endfor %}
agenda = StreamField([
    ('item_title', blocks.TextBlock()),
    ('item_content', blocks.ListBlock(blocks.StructBlock([
        ('item_text', blocks.TextBlock()),
        ('mtg_doc', blocks.StructBlock([
            ('doc_description', blocks.TextBlock()),
            ('doc_link', blocks.TextBlock())
        ]))
    ])))
])