轮播模型定义或阻止

时间:2016-07-18 10:40:22

标签: django wagtail wagtail-snippet wagtail-streamfield

这两个创建轮播的实现有什么不同?它们似乎都做了同样的事情,但是有一个明确定义了外键。第一个实现可以通过调用来轻松插入,同时第二个实现必须通过ParentalKey连接到模型。基本上,哪个是实现旋转木马以在主页上显示的更好选择?

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 个答案:

答案 0 :(得分:1)

StructBlock / StreamField方法的主要好处是能够在序列中混合不同的块类型 - 例如,您可以定义ImageCarouselBlockVideoCarouselBlock以具有混合图像的轮播和视频。

如果序列中只有一种对象,则两种方法之间的选择并不多。但是,从数据建模的角度来看,使用子模型/ InlinePanel可以说是更好的,因为它可以确保每个对象都获得一个真正的数据库条目(与StreamField不同,数据存储在单个JSON字段中),这意味着您可以运行针对该数据的数据库查询。 (找到一个非常人为的例子,你想要用旋转木马做这件事有点困难 - 但是你可以说“给我所有的新闻页面都包含图片X在他们的旋转木马上”。)