Определение модели карусели или блок

В чем разница между этими двумя реализациями создания карусели? Похоже, что они оба делают одно и то же, но у каждого явно определены внешние ключи. Первую реализацию можно легко подключить, вызвав ее, в то время как вторая реализация должна быть подключена к модели через 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 ответ

Решение

Основным преимуществом подхода StructBlock / StreamField является возможность смешивать различные типы блоков в последовательности - например, вы можете определить ImageCarouselBlock а также VideoCarouselBlock иметь карусель, которая смешивает изображения и видео.

Если у вас есть только один тип объекта в последовательности, выбор между этими двумя подходами невелик. Однако использование дочерней модели / InlinePanel, возможно, лучше с точки зрения моделирования данных, поскольку гарантирует, что каждый объект получает реальную запись в базе данных (в отличие от StreamField, где данные хранятся в одном поле JSON), что означает, что вы можете запустить запросы базы данных к этим данным. (Немного трудно найти не надуманный пример того, почему вы хотели бы сделать это с каруселью, но вы могли бы сказать что-то вроде "дай мне все страницы новостей, которые включают изображение X в их карусель".)

Другие вопросы по тегам