使用 Wagtail 页面或 Django 模型的指南?

2023-12-23

例如,我想使用wagtail建立一个电子商务网站,其中一个组件是订单。我认为 order 不应该是 wagtail Page,而是简单的 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 模型,所以我可以在 wagtail 管理 UI 上看到它们。

我的问题是

  1. 什么时候使用wagtail Page模型,什么时候使用Django模型? 在上面的例子中,订单被定义为 Django 模型,或者我应该使用 Page?

  2. 如何正确使用Django模型的面板? 我看到一些教程,我可以使用 Django 模型的面板,但在上面的代码中,我想列出每个订单中的所有订购产品(即XyzOrder)在 wagtail 管理 UI 上,但它不起作用。

  3. 如何选择多个订单并批量删除? 看起来 wagtail admin 不支持 Django 模型的批量选择和删除,但 Django admin 支持。那么我们如何进行批量选择和删除呢?


虽然这个问题很老了,但这是一个在 2023 年更新的好问题。

去年,Wagtail 已经从 contrib ModelAdmin(Wagtail 的,不是 Django 的)迁移到对 Snippets 系统更好的一流支持。

从本质上讲,片段是您想要轻松管理、访问、报告甚至只是在 Wagtail 管理员中查看的任何非页面模型。它们现在支持针对主应用程序之外的模型(例如第三方包)进行注册。

此外,还有很多功能,例如发布、修订、批量更改(不是编辑,而是删除等)、审核日志、权限系统和高级面板编辑。

这使得 Pages 和“任何模型”在功能方面几乎相同。

当选择您的模型应该是页面还是非页面片段时,现在唯一真正考虑的是您希望如何管理模型中的内容。如果它是一个像页面一样的东西,有层次结构,有一个独特的 URL slug,有一个标题等,那么页面就有意义了。

否则,可以使用针对标准 Django 模型注册的片段,而不会产生太多缺点。

提醒一下,即使您希望用户通过 URL 访问其他模型,您也可以使用 RouteablePageMixin 来提供来自其他模型的数据。

最后,您是否应该为电子商务网站使用 CMS 是需要仔细考虑的事情。存在重叠,但每个都有其自己的复杂空间,在选择工具之前您应该始终了解您的用例。值得庆幸的是,Wagtail 努力成为“只是 Django”,因此与 Django 电子商务框架的集成应该始终是可能的,但可能并不简单。

一些有用的链接:

  • 片段文档 -https://docs.wagtail.org/en/stable/topics/snippets.html 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/reference/contrib/routablepage.html
  • 报告文档https://docs.wagtail.org/en/stable/extending/adding_reports.html https://docs.wagtail.org/en/stable/extending/adding_reports.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Wagtail 页面或 Django 模型的指南? 的相关文章

随机推荐

  • 如何从Android中的CalendarView中选择日期范围?

    我需要从 android 的 CalenderView 中选择多次日期 任何人都可以帮助我做同样的事情吗 例子 让我们看看附图 如果我们将图像中的日历视为 android 的日历视图 我需要选择从 16 日到 20 日的所有日期 据我所知C
  • Yii2,抛出NotFoundException时发生错误

    我有一个在应用程序的 beforeAction 事件上运行的简单代码 on beforeAction gt function event throw new yii web NotFoundHttpException The request
  • 如何通过索引将项目添加到 Laravel Eloquent Collection 中?

    我尝试了以下方法 但它不起作用 index 2 collection gt put index item4 例如 如果 collection 看起来像这样 collection item1 item2 item3 我想结束 collecti
  • Gradle 在 bin 目录中创建重复的启动脚本

    我正在尝试通过 gradle 创建多个启动脚本文件 但不知何故 一个特定的启动脚本文件正在重复 startScripts enabled false run enabled false def createScript project ma
  • Java 泛型放在 Map>

    有没有办法以类型安全的方式进行以下实现 public void myMethod Map
  • 如何比较 Svelte 3 中的 Prop 变化

    Svelte 3 中是否有一种机制可以在渲染之前比较组件内的 prop 更改 类似于 反应从Props获取DerivedState https reactjs org docs react component html static get
  • 车把模板中 href 标签中的 Ember 插值

    我正在尝试建立一个到谷歌地图的简单链接 并将动态地址插入到 href 字段中 我已经尝试过下面的代码以及大量其他乱七八糟的东西 但没有运气 如何在车把 href 字段中插入动态 ember 字符串 我正在使用 ember 导轨和车把 如果我
  • 将二进制路径添加到 emacs $PATH

    我尝试了以下方法 setenv PATH concat getenv PATH mybin setq exec path append exec path mybin 但这从来没有奏效 我试过M 并键入二进制名称之一 并且在使用二进制名称进
  • Select2:init后如何设置数据?

    我需要在初始化 select2 后设置一个数据数组 所以我想做这样的事情 var select select select2 select data id 1 text value1 id 1 text value1 但我收到以下错误 当附
  • 连接字符串和实体框架的问题

    我有一个数据库 sql 2008 mdf 文件 一个带有 edmx 文件的类库项目 是使用向导创建的 所以连接字符串也是由向导制作的 该项目位于 teamfoundation 服务器上 我可以在编码时使用所有向导创建的对象 但是当我运行程序
  • DisplayFormat 未应用于十进制值

    我有一个模型属性 我正在尝试使用 EditorFor 模板进行渲染 并且我正在尝试使用 DisplayFormat 属性应用格式 然而 它根本不起作用 它完全被忽略了 这是我的模板 model System Decimal Html Tex
  • IoC:如何动态创建对象

    我无法理解如何在需要动态创建对象的场景中使用 IoC 假设我有这样的课程 abstract class Field public Field ICommandStack commandStack abstract class Entity
  • 使用 python 的树莓派旋转编码器脚本

    我有一个设置 其中有一个电机以每秒约 1 转的速度转动直径 5 厘米的轴 我需要在预定的转数后停止电机 现在假设是 10 转 我使用的传感器机制只是一个磁铁和簧片开关 以下脚本可以很好地记录每次触发开关的情况 import RPi GPIO
  • Android SQLite 数据库损坏

    这个链接准确地描述了我的问题 http old nabble com Android database corruption td28044218 html a28044218 http old nabble com Android dat
  • 如何在postgresql中使用设置种子选择可重复的随机数?

    我想要实现的是为流程选择一个控制组 为此 我使用 random 为了调试 一致性 我希望能够以可重复的方式设置随机数 意思是 一旦它为用户 123 分配随机数 0 001 我就运行查询 在不同的时间 我删除以前的数据 调用相同的查询 并再次
  • 如何从应用程序设置 Azure (webapp) 接收数据到我的 webjob

    我用 C 创建了一个 Azure WebJob 我在 Azure 上有一个 Web 应用程序 我将 WebJob 添加到了我的订阅中 一切都很好 但在应用程序设置中我添加了一个新条目 例如
  • C 比较两个位图的最快方法

    有两个字符数组形式的位图数组 有数百万条记录 使用 C 来比较它们的最快方法是什么 我可以想象在 for 循环中一次使用按位运算符异或 1 个字节 关于位图的重要一点 算法运行的 1 到 10 次中 位图可能会有所不同 大多数时候它们都是一
  • async void 方法每次调用时都会创建一个新线程吗?

    我有以下场景 async void DoStuff button1 Click s p gt DoStuff 我不确定当我打电话时会发生什么async void方法 而第一次调用仍然不完整 该调用是否会在每次调用时创建一个新线程 还是会销毁
  • 将 jar 库导入 android-studio

    android studio 0 2 7 Fedora 18 Hello 我正在尝试将 jtwitter jar 添加到我的项目中 首先我尝试执行以下操作 1 Drag the jtwitter jar into the root dire
  • 使用 Wagtail 页面或 Django 模型的指南?

    例如 我想使用wagtail建立一个电子商务网站 其中一个组件是订单 我认为 order 不应该是 wagtail Page 而是简单的 Django 模型 见下面的代码 from django db import models from