【问题标题】:Carousel Model Definition or Block轮播模型定义或块
【发布时间】:2016-07-18 10:40:22
【问题描述】:

这两种创建轮播的实现有什么区别?他们似乎都在做同样的事情,但是其中一个明确定义了外键。第一个实现可以通过调用轻松插入,同时第二个实现必须通过 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

【问题讨论】:

    标签: django wagtail wagtail-snippet wagtail-streamfield


    【解决方案1】:

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

    如果序列中只有一种对象,则两种方法之间没有太多选择余地。但是,从数据建模的角度来看,使用子模型/InlinePanel 可以说更好,因为它确保每个对象都获得一个真实的数据库条目(与数据存储在单个 JSON 字段中的 StreamField 不同),这意味着您可以运行针对该数据的数据库查询。 (很难找到一个非人为的例子来说明为什么要使用轮播来执行此操作 - 但您可以说“给我所有在轮播中包含图像 X 的新闻页面”。)

    【讨论】:

      猜你喜欢
      • 2016-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-14
      • 2014-04-10
      • 1970-01-01
      相关资源
      最近更新 更多