无法访问模板中 Streamfield 中嵌套块的值
Unable to access values of nested blocks in Streamfield, within Template
我是 Wagtail 的新手,但已完成作业并阅读了文档并在网上搜索了其他参考资料,但无法弄清楚为什么我无法成功循环并呈现输入到 Steamfield 内的各种块中的值。我已经在主页模板和区块模板中都尝试过了。
这是我的模型(agenda_item 的模板现在被注释掉了):
class AgendaPage(Page):
author= models.CharField(max_length=255)
date = models.DateField('Post date')
agenda = StreamField([
('agenda_item', blocks.StreamBlock([
('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())
]))
])))
]
#,
#template='blocks/agenda_temp.html',
))
])
content_panels = Page.content_panels + [
FieldPanel('author'),
FieldPanel('date'),
StreamFieldPanel('agenda'),
]
当我有像这样的最基本的模板时,在编辑器中发布页面时输入的所有值都会被渲染,但带有它前面的块的名称。所以在这个基本模板中:
{% for block in self.agenda %}
{{ block.value }}
{% endfor %}
如果我尝试单独访问其中的值,我什么也得不到。下面只是一个示例,但我尝试了许多其他语法组合,包括为名为 "agenda_item" 的块使用单独的模板但无济于事:
{% if block.block_type == 'item_title' %}
<h2>{{ block.value }}<h2>
{% endif %}
我的 Streamfield 嵌套是否有问题,即使它确实被保存到数据库并使用简单的 {{block}} 标签呈现?
更新:
我接受了这个答案,因为它解决了我的模板渲染问题,但也许这张截图将有助于说明我现有的问题。流块 'agenda_item' 可以通过单击编辑器界面中的 + 来添加额外的 child 块到 'agenda_item' 以及添加一个新的 'agenda_item' 这很棒,并且几乎正是我所需要的。问题是我只希望 'item_title' 可用于新的 'agenda_item' 而不是 'agenda_item' 中的 children。这就是为什么我最初嵌套 streamfield children 这样但后来无法访问模板渲染中的最低级别嵌套块。因此缩减流场的级别解决了这个问题,但现在用户可能会错误地在不必要或无效的地方添加 item_title。我的问题是:哪些可用的流场块(或其组合)可能有助于实现这一目标?
我现有的模型和面板定义如下所示:
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'),
]
按照您当前编写代码的方式,您的顶级块始终是 agenda_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 %}
但是,我认为您根本不需要 agenda_item
StreamBlock - 它只是添加了一个不必要的间接级别,让您感到困惑。据我所知,只需将 item_title
和 item_content
设为顶层的两种可用块类型即可获得相同的结果:
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())
]))
])))
])
(或者您打算 agenda_item
改为 StructBlock...?)
我是 Wagtail 的新手,但已完成作业并阅读了文档并在网上搜索了其他参考资料,但无法弄清楚为什么我无法成功循环并呈现输入到 Steamfield 内的各种块中的值。我已经在主页模板和区块模板中都尝试过了。
这是我的模型(agenda_item 的模板现在被注释掉了):
class AgendaPage(Page):
author= models.CharField(max_length=255)
date = models.DateField('Post date')
agenda = StreamField([
('agenda_item', blocks.StreamBlock([
('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())
]))
])))
]
#,
#template='blocks/agenda_temp.html',
))
])
content_panels = Page.content_panels + [
FieldPanel('author'),
FieldPanel('date'),
StreamFieldPanel('agenda'),
]
当我有像这样的最基本的模板时,在编辑器中发布页面时输入的所有值都会被渲染,但带有它前面的块的名称。所以在这个基本模板中:
{% for block in self.agenda %}
{{ block.value }}
{% endfor %}
如果我尝试单独访问其中的值,我什么也得不到。下面只是一个示例,但我尝试了许多其他语法组合,包括为名为 "agenda_item" 的块使用单独的模板但无济于事:
{% if block.block_type == 'item_title' %}
<h2>{{ block.value }}<h2>
{% endif %}
我的 Streamfield 嵌套是否有问题,即使它确实被保存到数据库并使用简单的 {{block}} 标签呈现?
更新: 我接受了这个答案,因为它解决了我的模板渲染问题,但也许这张截图将有助于说明我现有的问题。流块 'agenda_item' 可以通过单击编辑器界面中的 + 来添加额外的 child 块到 'agenda_item' 以及添加一个新的 'agenda_item' 这很棒,并且几乎正是我所需要的。问题是我只希望 'item_title' 可用于新的 'agenda_item' 而不是 'agenda_item' 中的 children。这就是为什么我最初嵌套 streamfield children 这样但后来无法访问模板渲染中的最低级别嵌套块。因此缩减流场的级别解决了这个问题,但现在用户可能会错误地在不必要或无效的地方添加 item_title。我的问题是:哪些可用的流场块(或其组合)可能有助于实现这一目标?
我现有的模型和面板定义如下所示:
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'),
]
按照您当前编写代码的方式,您的顶级块始终是 agenda_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 %}
但是,我认为您根本不需要 agenda_item
StreamBlock - 它只是添加了一个不必要的间接级别,让您感到困惑。据我所知,只需将 item_title
和 item_content
设为顶层的两种可用块类型即可获得相同的结果:
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())
]))
])))
])
(或者您打算 agenda_item
改为 StructBlock...?)