2016-07-18 8 views
0

カルーセルを作成するこれら2つの実装の違いは何ですか?どちらも同じことをしているようですが、一方は外部キーが明示的に定義されています。最初の実装はそれを呼び出すことで簡単にプラグインできますが、2番目の実装はParentalKeyを介してモデルに接続する必要があります。基本的に、ホームページに表示するカルーセルを実装するためのより良い選択肢はどれですか?そう、たとえば、あなたは画像やビデオをミックスカルーセルを持っているImageCarouselBlockVideoCarouselBlockを定義することができます -カルーセルモデル定義またはブロック

class ImageCarouselBlock(blocks.StructBlock): 
    image = ImageChooserBlock() 
    caption = blocks.TextBlock(required=False) 
    page = PageChooserBlock() 

    class Meta: 
     icon = 'image' 

class CarouselItem(LinkFields): 
    image = models.ForeignKey(
     'wagtailimages.Image', 
     null=True, 
     blank=True, 
     on_delete=models.SET_NULL, 
     related_name='+' 
    ) 
    link_url = models.models.ForeignKey(
     'wagtailcore.Page', 
     null=True, 
     blank=True, 
     on_delete=models.SET_NULL, 
     related_name='+' 
    ) 
    caption = models.CharField(max_length=255, blank=True) 

    panels = [ 
     ImageChooserPanel('image'), 
     FieldPanel('link_url'), 
     FieldPanel('caption'), 
     MultiFieldPanel(LinkFields.panels, "Link"), 
    ] 

    class Meta: 
     abstract = True 

答えて

1

StructBlock/StreamFieldアプローチの主な利点は、シーケンス内の異なるブロックタイプを混合する機能です。

シーケンス内に1種類のオブジェクトしかない場合は、2つの方法のどちらを選択するかはあまりありません。しかし、子モデル/ InlinePanelを使用することは、各オブジェクトが実際のデータベースエントリを取得するため(データが単一のJSONフィールドに格納されているStreamFieldとは異なります)、確実に実行できるという意味でデータモデリングの観点からは、そのデータに対するデータベースクエリ。 (これはカルーセルでこれをやりたいのではないかという非人為的な例を見つけるのはちょっと難しいですが、「画像Xをカルーセルに含むNewsPagesをすべて私に渡してください」などと言うことができます)

関連する問題