diff --git a/cms/plugin_rendering.py b/cms/plugin_rendering.py index 2e94527ebfc..f9b8c549384 100644 --- a/cms/plugin_rendering.py +++ b/cms/plugin_rendering.py @@ -557,10 +557,10 @@ def _get_cached_placeholder_content(self, placeholder, language): return language_cache.get(placeholder.pk) def _get_content_object(self, page, slots=None): - if self.toolbar.get_object() == page: + toolbar_obj = self.toolbar.get_object() + if isinstance(toolbar_obj, PageContent) and toolbar_obj.page == page: # Current object belongs to the page itself - page_content = self.toolbar.get_object() - placeholders = Placeholder.objects.get_for_obj(page_content) + return Placeholder.objects.get_for_obj(toolbar_obj) elif slots: # If looking for inherited placeholders, slots is specified if self.toolbar.preview_mode_active or self.toolbar.edit_mode_active: @@ -568,14 +568,13 @@ def _get_content_object(self, page, slots=None): .current_content(language=self.request_language).first()) else: page_content = page.pagecontent_set.filter(language=self.request_language).first() - placeholders = Placeholder.objects.get_for_obj(page_content) if page_content else Placeholder.objects.none() - else: - page_content = page.get_content_obj(self.request_language, fallback=False) - + return Placeholder.objects.get_for_obj(page_content) if page_content else Placeholder.objects.none() + elif page_content := page.get_content_obj(self.request_language, fallback=False): PageContent.page.field.set_cached_value(page_content, page) # Creates any placeholders missing on the page - placeholders = page_content.rescan_placeholders().values() - return placeholders + return page_content.rescan_placeholders().values() + else: + return Placeholder.objects.none() def _preload_placeholders_for_page(self, page, slots=None, inherit=False): """ diff --git a/cms/tests/test_rendering.py b/cms/tests/test_rendering.py index fa59656239e..58698f7c929 100644 --- a/cms/tests/test_rendering.py +++ b/cms/tests/test_rendering.py @@ -290,6 +290,19 @@ def test_details_view(self): r = self.strip_rendered(response.content.decode('utf8')) self.assertEqual(r, '|' + self.test_data['text_main'] + '|' + self.test_data['text_sub'] + '|') + def test_getting_placeholders(self): + """ContentRenderer._get_content_object uses toolbar to return placeholders of a page""" + request = self.get_request(page=self.test_page) + request.toolbar = CMSToolbar(request) + wrong_content_obj = self.test_page2.get_content_obj("en") + wrong_content_obj.page = self.test_page + request.toolbar.set_object(wrong_content_obj) + content_renderer = self.get_content_renderer(request) + placeholders = content_renderer._get_content_object(self.test_page) + wrong_content_obj.page = self.test_page2 + + self.assertEqual(len(placeholders), 2) + @override_settings( CMS_PLUGIN_PROCESSORS=('cms.tests.test_rendering.sample_plugin_processor',), CMS_PLUGIN_CONTEXT_PROCESSORS=('cms.tests.test_rendering.sample_plugin_context_processor',),