Рекомендации по использованию 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, поэтому я могу видеть их в пользовательском интерфейсе администратора трясогузки.
У меня есть вопросы
Когда использовать модель страницы трясогузки, когда использовать модель Django? В приведенном выше примере заказы определены как модели Django, или я должен использовать Page?
Как правильно использовать панели для моделей Django? Я видел учебник, в котором я мог бы использовать панели для моделей Django, но в приведенном выше коде я хочу перечислить все заказанные продукты в каждом порядке (т.е.
XyzOrder
) в интерфейсе администратора трясогузки, но это не работает.Как выбрать несколько заказов и удалить их массово? Похоже, у администратора трясогузки нет поддержки массового выбора и удаления для моделей Django, но у администратора Django есть. Итак, как мы можем выполнять массовый выбор и удаление?
1 ответ
Хотя этот вопрос устарел, стоит обновить его в 2023 году.
За последний год Wagtail перешел от Contrib ModelAdmin (Wagtail, а не Django) к улучшенной первоклассной поддержке системы сниппетов.
По сути, сниппеты — это любая модель, не относящаяся к странице, которой вы хотите легко управлять, получать к ней доступ, составлять отчеты или даже просто просматривать ее в администраторе Wagtail. Теперь они поддерживают регистрацию для моделей вне вашего основного приложения, таких как сторонние пакеты.
Кроме того, существует множество функций, таких как публикация, ревизии, массовые изменения (не редактирование, а удаление и другие), журналы аудита, системы разрешений и расширенное редактирование панели.
Это делает Pages и «любую модель» практически эквивалентными с точки зрения функций.
Когда дело доходит до выбора, должна ли ваша модель быть страницей или не-фрагментом страницы, единственным реальным соображением теперь будет то, как вы хотите управлять контентом в моделях. Если это что-то вроде страницы, наследственное, имеет отдельный URL-адрес, заголовок и т. д., тогда страница будет иметь смысл.
В противном случае сниппеты, зарегистрированные по стандартной модели Django, можно использовать без особых недостатков.
Напоминаем, что даже если вы хотите, чтобы пользователи получали доступ к другим вашим моделям по URL-адресу, вы можете использовать RouteablePageMixin для обслуживания данных из других моделей.
Наконец, следует внимательно рассмотреть вопрос о том, следует ли вам использовать CMS для веб-сайта электронной коммерции. Есть совпадения, но каждое из них представляет собой свое собственное сложное пространство, и вы всегда должны понимать свой вариант использования, прежде чем выбирать инструмент. К счастью, Wagtail стремится быть «просто Django», поэтому интеграция с платформой электронной коммерции Django всегда возможна, но, возможно, не проста.
Некоторые полезные ссылки:
- Документация по фрагментам — https://docs.wagtail.org/en/stable/topics/snippets.html.
- RouteablePageMixin — https://docs.wagtail.org/en/stable/reference/contrib/routablepage.html
- Документация по отчетам https://docs.wagtail.org/en/stable/extending/adding_reports.html.