django CMS页面扩展数据重复

时间:2016-05-11 18:55:38

标签: python django django-cms

我有一个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列表。

此外,在我调用MyAppExtension.objects.get(extended_object=self.request.current_page)时,在实时模式下,当我在草稿模式下调用时,它与pk不同。所以我的问题:

  • 发生了什么事?
  • 如何在实时模式下获取正确的对象?
  • 为什么每个扩展都有重复?

live to draft

2 个答案:

答案 0 :(得分:1)

cms.Page个对象以已发布和草稿形式存在,并且草稿(以及与之关联的所有对象)将复制到“发布”操作中的另一个版本。

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

页面扩展文档中的

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

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

答案 1 :(得分:0)

也许您可以使用类似这样的东西:

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)