Рекомендации по использованию Wagtail Pages или моделей Django?

Например, я хочу создать веб-сайт электронной коммерции с использованием трясогузки, одним из компонентов является заказ. Я думаю, что порядок должен быть не страницей, а простой моделью Django, см. Код ниже.

from django.db import models

from wagtail.admin.edit_handlers import (
    FieldPanel,
    StreamFieldPanel,
    MultiFieldPanel,
    InlinePanel,
)
from wagtail.core.fields import RichTextField
from wagtail.core.models import Page

# Since product details are shown to users, so need to have a Page for it.
class XyzProductPage(Page):
    template = "product/product_page.html"

    name = models.CharField(max_length=100)
    desc = RichTextField(blank=False, null=True)

    content_panels = Page.content_panels + [
        FieldPanel("name"),
        FieldPanel("desc"),
    ]

class XyzOrderedProduct(models.Model):
    product = models.ForeignKey(
        "XyzProductPage", on_delete=models.CASCADE, related_name="+"
    )
    order = models.ForeignKey(
        "XyzOrder", on_delete=models.CASCADE, related_name="ordered_products"
    )

# Orders are not shown to users, only for internal use, so use Django model
class XyzOrder(models.Model):
    panels = [
        # and per each order, I want to display all ordered products on wagtail admin UI,
        # so I try to use this MultiFieldPanel, but doesn't seem to work, why?
        MultiFieldPanel(
            [InlinePanel("ordered_products", label="Ordered Product",)],
            heading="Ordered Product(s)",
        ),
    ]

Я также определил ModelAdmin для вышеуказанных моделей Django, поэтому я могу видеть их в пользовательском интерфейсе администратора трясогузки.

У меня есть вопросы

  1. Когда использовать модель страницы трясогузки, когда использовать модель Django? В приведенном выше примере заказы определены как модели Django, или я должен использовать Page?

  2. Как правильно использовать панели для моделей Django? Я видел учебник, в котором я мог бы использовать панели для моделей Django, но в приведенном выше коде я хочу перечислить все заказанные продукты в каждом порядке (т.е.XyzOrder) в интерфейсе администратора трясогузки, но это не работает.

  3. Как выбрать несколько заказов и удалить их массово? Похоже, у администратора трясогузки нет поддержки массового выбора и удаления для моделей Django, но у администратора Django есть. Итак, как мы можем выполнять массовый выбор и удаление?

1 ответ

Хотя этот вопрос устарел, стоит обновить его в 2023 году.

За последний год Wagtail перешел от Contrib ModelAdmin (Wagtail, а не Django) к улучшенной первоклассной поддержке системы сниппетов.

По сути, сниппеты — это любая модель, не относящаяся к странице, которой вы хотите легко управлять, получать к ней доступ, составлять отчеты или даже просто просматривать ее в администраторе Wagtail. Теперь они поддерживают регистрацию для моделей вне вашего основного приложения, таких как сторонние пакеты.

Кроме того, существует множество функций, таких как публикация, ревизии, массовые изменения (не редактирование, а удаление и другие), журналы аудита, системы разрешений и расширенное редактирование панели.

Это делает Pages и «любую модель» практически эквивалентными с точки зрения функций.

Когда дело доходит до выбора, должна ли ваша модель быть страницей или не-фрагментом страницы, единственным реальным соображением теперь будет то, как вы хотите управлять контентом в моделях. Если это что-то вроде страницы, наследственное, имеет отдельный URL-адрес, заголовок и т. д., тогда страница будет иметь смысл.

В противном случае сниппеты, зарегистрированные по стандартной модели Django, можно использовать без особых недостатков.

Напоминаем, что даже если вы хотите, чтобы пользователи получали доступ к другим вашим моделям по URL-адресу, вы можете использовать RouteablePageMixin для обслуживания данных из других моделей.

Наконец, следует внимательно рассмотреть вопрос о том, следует ли вам использовать CMS для веб-сайта электронной коммерции. Есть совпадения, но каждое из них представляет собой свое собственное сложное пространство, и вы всегда должны понимать свой вариант использования, прежде чем выбирать инструмент. К счастью, Wagtail стремится быть «просто Django», поэтому интеграция с платформой электронной коммерции Django всегда возможна, но, возможно, не проста.

Некоторые полезные ссылки:

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