这两个创建轮播的实现有什么不同?它们似乎都做了同样的事情,但是有一个明确定义了外键。第一个实现可以通过调用来轻松插入,同时第二个实现必须通过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
答案 0 :(得分:1)
StructBlock / StreamField方法的主要好处是能够在序列中混合不同的块类型 - 例如,您可以定义ImageCarouselBlock
和VideoCarouselBlock
以具有混合图像的轮播和视频。
如果序列中只有一种对象,则两种方法之间的选择并不多。但是,从数据建模的角度来看,使用子模型/ InlinePanel可以说是更好的,因为它可以确保每个对象都获得一个真正的数据库条目(与StreamField不同,数据存储在单个JSON字段中),这意味着您可以运行针对该数据的数据库查询。 (找到一个非常人为的例子,你想要用旋转木马做这件事有点困难 - 但是你可以说“给我所有的新闻页面都包含图片X在他们的旋转木马上”。)