私はWagtailを初めて使っていますが、宿題をしてドキュメントを読んだり追加の参考文献を検索しましたが、 Steamfield内のバロスブロックに変換します。私は、メインページのテンプレートとブロックのテンプレートの両方で試してみました。ここでテンプレート内のStreamfield内のネストされたブロックの値にアクセスできない
は(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}}タグでレンダリングされますか?
UPDATE: それは私のテンプレートのレンダリングの問題を解決し、おそらくこのスクリーンショットは私の既存の問題を説明するのに役立ちますので、私はこの答えを受け入れました。ストリームブロック 'agenda_item'は、エディタのインターフェイスで+をクリックして、 'agenda_item'に子ブロックを追加するだけでなく、新しい 'agenda_item'を追加することで利用できます。問題は、 'agenda_item'内の子供用ではなく、新しい 'agenda_item'にのみ 'item_title'を使用できるようにすることです。これは、もともとストリームフィールドの子をネストしていましたが、テンプレートレンダリングの最下位のネストされたブロックにアクセスできなかった理由です。そのため、ストリームフィールドのレベルをスケールし直して解決しましたが、今ではユーザが間違ってitem_titleを追加する必要があります。私の質問は:利用可能なストリームフィールドブロック(またはその組み合わせ)がこれを達成するのに役立つかもしれないものは何ですか?
Valid XHTML http://pocketsofactivity.com/scrnsht.jpg
私の既存のモデルとパネル定義は次のようになります。あなたのコードは、現在書かれているように
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をstructblockにしたかったと思います。私はこのサブブロックの構文を試したり、レベルを削除したりします.Wagtailの文書はどこにも書かれた単語サブブロックです。 – JohnnyP
'サブブロック'はWagtailの概念ではありません。それをトップレベルブロックと区別します。 – gasman
この解決策はitem_titleの値を返しますが、structblockを適切に反復処理できません:item_content、これは次のように表示されます:[StructValue([item_text '、' ... '思考? – JohnnyP