【发布时间】: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 魔术来呈现树、拖放和相应地更新隐藏的输入。
【问题讨论】: