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