2016-06-15 11 views
2

を使用した場合セキレイ巡回ブロックの依存関係を解決するためにはどうすれば StreamBlock

from wagtail.wagtailcore.blocks import StreamBlock, StructBlock 


class CarouselBlock(StructBlock): 

    content = StreamBlock([ 
     ('tab', TabBlock()), 
     ('carousel', CarouselBlock()) 
    ]) 


class TabBlock(StructBlock): 

    content = StreamBlock([ 
     ('tab', TabBlock()), 
     ('carousel', CarouselBlock()) 
    ]) 

カルーセルで

、私はタブまたは別のカルーセルを追加することができますし、タブの内側に私が追加することができ、このような何かを達成したいと思いますカルーセルまたは別のタブ。

これらのようなプログラミングケースを処理する場合のベストプラクティスは何ですか。

答えて

3

定義で循環参照を設定する方法が見つかったとしても、残念ながら私はこの作業を行うことはできないと思います。 Wagtailのコードには、定義を木としてトラバースしようとする場所がたくさんあり、無限の再帰で終わります。マイグレーション内部StreamField定義を凍結するとき

例えば、これが起こる - それは、この場合、無限に拡大する普通StructBlock/StreamBlockコンストラクタ(http://docs.wagtail.io/en/v1.5.2/topics/streamfield.html#streamfield-definitions-within-migrations参照)に名付けStructBlock/StreamBlockサブクラスへの参照を拡大します。同様に、フォーム内の反復可能な各要素(つまり、新しいカルーセルを追加するためにクリックするたびに追加されるHTMLブロック、または新しいタブを追加するためのHTMLテンプレートを構築するためのHTMLテンプレートを構築しようとするため、 ) - トップレベルのカルーセル、第2レベルのカルーセル、第3レベルのカルーセルなどに同じテンプレートを再利用するほど巧妙ではないので、生成するテンプレートは無限になります。

ネスティングのレベル数にハードコードされた制限を設ける必要があります(たとえば、CarouselBlockにはThirdLevelCarouselブロックを含むことができるSecondLevelCarouselブロックを含めることができますが、それ以上ではありません)。無限にネスト可能な単一のフォームではなく、複数のビューにデータ・エントリを分散する代替データ表現。たとえば、スニペットモデルとしてカルーセルとタブを定義し、それらの間の親/子リンクを定義するためにSnippetChooserBlockを使用することができます。あなたはこのルートを下る場合

@register_snippet 
class Carousel(models.Model): 
    content = StreamField([ 
     ('carousel', blocks.SnippetChooserBlock('myapp.Carousel')), 
     ('tab', blocks.SnippetChooserBlock('myapp.Tab')), 
    ]) 

(もちろん、あなたがいないと確認する必要があり循環親/子関係を設定するか、正方形に戻る:-))

+0

これを試してみましょう。 –

+0

'( 'tab'、blocks.SnippetChooserBlock( 'myapp.Tab')')文字列表現を使ってモデルを参照するこの機能は、最新のWagtailリリースにあります。 –

+0

スニペットに独自のテンプレートがありますか? –