2016-08-14 7 views
0

私は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'), 

] 

答えて

1

、あなたのトップレベルのブロックがタイプ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_titleitem_content利用可能な2つのブロックタイプすることによって、同じ結果を得ることができます。

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()) 
     ])) 
    ]))) 
]) 

(または、あなたが代わりにStructBlockするagenda_itemをつもりでしたが... ?)

+0

私はリストを作ることができるようにagenda_itemをstructblockにしたかったと思います。私はこのサブブロックの構文を試したり、レベルを削除したりします.Wagtailの文書はどこにも書かれた単語サブブロックです。 – JohnnyP

+1

'サブブロック'はWagtailの概念ではありません。それをトップレベルブロックと区別します。 – gasman

+0

この解決策はitem_titleの値を返しますが、structblockを適切に反復処理できません:item_content、これは次のように表示されます:[StructValue([item_text '、' ... '思考? – JohnnyP

関連する問題