【问题标题】:Wagtail - Expand Orderable / InlinePanel functionalityWagtail - 扩展 Orderable / InlinePanel 功能
【发布时间】:2021-02-18 13:49:44
【问题描述】:

我之前尝试过以不同的形式尝试过:将分类法添加到 Wagtail,这是大多数其他流行 CMS 中存在的功能(Drupal 为“分类法”,Craft 为“类别,...)。我知道 Wagtail 有某种类型的实现称为“集合”,但它不像其他实现那样成熟,而且它的接口不适合大型树。

我的方法:以Orderable 模型为基础,因为它们已经为我们提供了一种很好的方式来订购与其他模型相关的子项(想想 Menu -> MenuItems)。与InlinePanel 一起,Orderables 为您提供了一个很好的界面来管理您的主要分类名称及其所有“节点”。

然而,Orderable 是一维的,它只能通过 Orderable 模型上的 sort_order 列上升或下降。我的想法是提供第二个维度,向左或向右,带有parent 列。一个超级简单的数据模型:

class NestedOrderable(Orderable):
    parent = models.IntegerField(null=True, blank=True, editable=False)

    class Meta:
        abstract = True
        ordering = ['parent', 'sort_order']

现在在InlinePanel 中,排序顺序作为隐藏字段插入到每个子项上。我现在正试图找到一种方法,将这个 parent 属性也包含到 HTML 渲染中,就像 sort_order 一样作为隐藏输入。

InlinePanel 以这种方式注入 sort_order 字段:

subform.fields[ORDERING_FIELD_NAME].widget = forms.HiddenInput()

并在保存时更新模型。不过,我可以自己注入这个parent 字段:

subform.fields['parent'] = forms.IntegerField()
subform.fields['parent'].widget = forms.HiddenInput()

这当然会渲染隐藏字段,但与模型无关,保存时会被完全忽略。

所以,我想我的主要问题是:扩展InlinePanel 的正确方法是什么,以便我的parent 列自动注入为HiddenField 并从数据库中正确保存/检索?

当这个parent 列被正确保存时,我的感觉是我的主要部分正在运行以进行树设置。事物的(HTML)界面方面主要是 JavaScript 魔术来呈现树、拖放和相应地更新隐藏的输入。

【问题讨论】:

    标签: python django wagtail


    【解决方案1】:

    可能很久以前就解决了,但是对于任何阅读的人,您只需要在表单字段中提取数据并在 clean() 中分配它即可

    self.parent = self.data['parent']
    

    隐藏字段不是清理/保存过程的一部分。

    我想找到的是如何访问可创建可排序模型的实例并从中传递参数。我可以覆盖 for 类、父表单类和元类以及表单构建器类,但这些都不能让我从子可订购对象访问父对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-06
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      • 1970-01-01
      • 2020-05-03
      • 2011-10-10
      相关资源
      最近更新 更多