私は Wagtail を初めて使用しますが、宿題を済ませ、ドキュメントを読み、Web で追加の参照を検索しましたが、Steamfield 内のさまざまなブロックに入力された値を正常にループしてレンダリングできない理由がわかりません。メインページテンプレート内とブロックのテンプレートの両方で試しました。
これが私のモデルです (アジェンダ_アイテムのテンプレートは現在コメントアウトされています):
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 %}
データベースに保存され、単純な {{block}} タグでレンダリングされますが、Streamfield のネストに何か問題があるのでしょうか?
アップデート: テンプレートのレンダリングの問題が解決したため、この回答を受け入れましたが、おそらくこのスクリーンショットが既存の問題を説明するのに役立ちます。ストリームブロック 'agenda_item' は、エディター インターフェイスで + をクリックして、追加の子ブロックを 'agenda_item' に追加したり、新しい 'agenda_item' を追加したりすることで利用できます。問題は、「item_title」を新しい「agenda_item」でのみ使用可能にし、「agenda_item」内の子供には使用できないようにすることです。これが、最初にストリームフィールドの子をネストしたのに、テンプレート レンダリングでネストされた最下位レベルのブロックにアクセスできなかった理由です。そのため、ストリームフィールドのレベルを縮小することで解決しましたが、ユーザーは不要または有効でない item_title を誤って追加する可能性があります。私の質問は:
(出典: pocketofactivity.com )
私の既存のモデルとパネルの定義は次のようになります。
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'),
]