django CMS 页面扩展数据重复

django CMS page extension data duplication

我有一个 Django CMS page extension:

class MyAppExtension(PageExtension):
    show_in_catalog = models.BooleanField()
    filters_to_show = models.ManyToManyField(Attribute)

extension_pool.register(MyAppExtension)

观看次数:

class MyListView(FilterView):
    .....

    def get_filterset_kwargs(self, filterset_class):
        extension = MyAppExtension.objects.get(
                                extended_object=self.request.current_page)
        attributes = extension.filters_to_show.all()

现在在每个页面中我都应该得到属性列表。但是在 Live 模式下,我得到一个空列表。当我切换到 Draft 模式时,我得到了预期的属性列表,就像它应该的那样。

经过一些混乱,我发现每个页面都有重复的 MyAppExtension.objects.all(),每个页面都有一个空的 filters_to_show 列表。

此外,在 Live 模式下,当我调用 MyAppExtension.objects.get(extended_object=self.request.current_page) 时,它与我在 Draft[ 中调用时有不同的 pk =39=]模式。所以我的问题:

  • 这是怎么回事?
  • 如何在 Live 模式下获取正确的对象?
  • 为什么每个扩展都有一个重复的?

cms.Page 对象以已发布和草稿形式存在,并且草稿(连同与其关联的所有对象)在发布操作中被复制到其他版本。

您的 MyAppExtension.objects 具有 ManyToManyField 属性。这些也需要复制,否则发布的版本将失败 - 正如您所发现的 - 无法返回这些对象。

Page 扩展文档中的

Handling relations 解释了该做什么并给出了一个示例 - 简而言之,在 Page 扩展上提供一个 copy_relations() 方法,将它们复制到新实例。

如果没有这个方法,你会发现页面上的所有复制操作,不仅仅是发布,都无法复制对象。

也许你可以使用这样的东西:

class PageDataExtension(PageExtension):

    category_page = models.ManyToManyField(category, blank=True)

    def copy_relations(self, oldinstance, language):
        self.category_page.clear()

        for pcategory in oldinstance.category_page.all():
            self.category_page.add(pcategory)