我有一个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
不同。所以我的问题:
答案 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)