轮播模型定义或块
Carousel Model Definition or Block
这两种创建轮播的实现有什么区别?他们似乎都做同样的事情,但是其中一个明确定义了外键。第一个实现可以通过调用轻松插入,同时第二个实现必须通过 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
StructBlock / StreamField 方法的主要优点是能够在序列中混合不同的块类型 - 因此,例如,您可以定义 ImageCarouselBlock
和 VideoCarouselBlock
来拥有一个轮播混合图像和视频。
如果序列中只有一种对象,则两种方法之间没有太多选择。但是,从数据建模的角度来看,使用子模型/InlinePanel 可以说更好,因为它确保每个对象都获得一个真实的数据库条目(不像 StreamField,其中数据存储在单个 JSON 字段中),这意味着您可以 运行 数据库查询该数据。 (很难找到一个非人为的例子来说明为什么你想用轮播来做到这一点 - 但你可以说 "give me all of the NewsPages that include image X in their carousel"。)
这两种创建轮播的实现有什么区别?他们似乎都做同样的事情,但是其中一个明确定义了外键。第一个实现可以通过调用轻松插入,同时第二个实现必须通过 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
StructBlock / StreamField 方法的主要优点是能够在序列中混合不同的块类型 - 因此,例如,您可以定义 ImageCarouselBlock
和 VideoCarouselBlock
来拥有一个轮播混合图像和视频。
如果序列中只有一种对象,则两种方法之间没有太多选择。但是,从数据建模的角度来看,使用子模型/InlinePanel 可以说更好,因为它确保每个对象都获得一个真实的数据库条目(不像 StreamField,其中数据存储在单个 JSON 字段中),这意味着您可以 运行 数据库查询该数据。 (很难找到一个非人为的例子来说明为什么你想用轮播来做到这一点 - 但你可以说 "give me all of the NewsPages that include image X in their carousel"。)