-
-
Notifications
You must be signed in to change notification settings - Fork 3.2k
Closed
Labels
Description
Description
When logging into Django-Admin and opening the Page content list and changing to a tree of another site the preview links or edit links throws 'EmptyPageContent' object has no attribute '_state'
Steps to reproduce and actual behaviour
- Open you Admin eg
example.com/en/admin/
- Search vor CMS | Page contents and open the page tree eg
example.com/en/admin/cms/pagecontent/
- Change the site and the tree of that site will be loaded.
- Click on the eye icon of a page
- See the error page (local) or a 500er error page:
Full stacktrace:
AttributeError: 'EmptyPageContent' object has no attribute '_state'
File "django/core/handlers/exception.py", line 55, in inner
response = get_response(request)
File "django/core/handlers/base.py", line 220, in _get_response
response = response.render()
File "django/template/response.py", line 114, in render
self.content = self.rendered_content
File "django/template/response.py", line 92, in rendered_content
return template.render(context, self._request)
File "django/template/backends/django.py", line 107, in render
return self.template.render(context)
File "django/template/base.py", line 171, in render
return self._render(context)
File "django/template/base.py", line 163, in _render
return self.nodelist.render(context)
File "django/template/base.py", line 1008, in render
return SafeString("".join([node.render_annotated(context) for node in self]))
File "django/template/base.py", line 1008, in <listcomp>
return SafeString("".join([node.render_annotated(context) for node in self]))
File "django/template/base.py", line 969, in render_annotated
return self.render(context)
File "django/template/loader_tags.py", line 159, in render
return compiled_parent._render(context)
File "django/template/base.py", line 163, in _render
return self.nodelist.render(context)
File "django/template/base.py", line 1008, in render
return SafeString("".join([node.render_annotated(context) for node in self]))
File "django/template/base.py", line 1008, in <listcomp>
return SafeString("".join([node.render_annotated(context) for node in self]))
File "django/template/base.py", line 969, in render_annotated
return self.render(context)
File "django/template/loader_tags.py", line 159, in render
return compiled_parent._render(context)
File "django/template/base.py", line 163, in _render
return self.nodelist.render(context)
File "django/template/base.py", line 1008, in render
return SafeString("".join([node.render_annotated(context) for node in self]))
File "django/template/base.py", line 1008, in <listcomp>
return SafeString("".join([node.render_annotated(context) for node in self]))
File "django/template/base.py", line 969, in render_annotated
return self.render(context)
File "django/template/loader_tags.py", line 159, in render
return compiled_parent._render(context)
File "django/template/base.py", line 163, in _render
return self.nodelist.render(context)
File "django/template/base.py", line 1008, in render
return SafeString("".join([node.render_annotated(context) for node in self]))
File "django/template/base.py", line 1008, in <listcomp>
return SafeString("".join([node.render_annotated(context) for node in self]))
File "django/template/base.py", line 969, in render_annotated
return self.render(context)
File "django/template/loader_tags.py", line 159, in render
return compiled_parent._render(context)
File "django/template/base.py", line 163, in _render
return self.nodelist.render(context)
File "django/template/base.py", line 1008, in render
return SafeString("".join([node.render_annotated(context) for node in self]))
File "django/template/base.py", line 1008, in <listcomp>
return SafeString("".join([node.render_annotated(context) for node in self]))
File "django/template/base.py", line 969, in render_annotated
return self.render(context)
File "classytags/core.py", line 142, in render
return str(self.render_tag(context, **kwargs))
File "sekizai/templatetags/sekizai_tags.py", line 87, in render_tag
rendered_contents = nodelist.render(context)
File "django/template/base.py", line 1008, in render
return SafeString("".join([node.render_annotated(context) for node in self]))
File "django/template/base.py", line 1008, in <listcomp>
return SafeString("".join([node.render_annotated(context) for node in self]))
File "django/template/base.py", line 969, in render_annotated
return self.render(context)
File "classytags/core.py", line 142, in render
return str(self.render_tag(context, **kwargs))
File "cms/templatetags/cms_tags.py", line 434, in render_tag
return toolbar.render_with_structure(context, nodelist)
File "cms/toolbar/toolbar.py", line 554, in render_with_structure
rendered_contents = nodelist.render(context)
File "django/template/base.py", line 1008, in render
return SafeString("".join([node.render_annotated(context) for node in self]))
File "django/template/base.py", line 1008, in <listcomp>
return SafeString("".join([node.render_annotated(context) for node in self]))
File "django/template/base.py", line 969, in render_annotated
return self.render(context)
File "django/template/loader_tags.py", line 65, in render
result = block.nodelist.render(context)
File "django/template/base.py", line 1008, in render
return SafeString("".join([node.render_annotated(context) for node in self]))
File "django/template/base.py", line 1008, in <listcomp>
return SafeString("".join([node.render_annotated(context) for node in self]))
File "django/template/base.py", line 969, in render_annotated
return self.render(context)
File "django/template/base.py", line 1067, in render
output = self.filter_expression.resolve(context)
File "django/template/base.py", line 718, in resolve
obj = self.var.resolve(context)
File "django/template/base.py", line 850, in resolve
value = self._resolve_lookup(context)
File "django/template/base.py", line 917, in _resolve_lookup
current = current()
File "django/template/loader_tags.py", line 81, in super
return mark_safe(self.render(self.context))
File "django/template/loader_tags.py", line 65, in render
result = block.nodelist.render(context)
File "django/template/base.py", line 1008, in render
return SafeString("".join([node.render_annotated(context) for node in self]))
File "django/template/base.py", line 1008, in <listcomp>
return SafeString("".join([node.render_annotated(context) for node in self]))
File "django/template/base.py", line 969, in render_annotated
return self.render(context)
File "django/template/loader_tags.py", line 65, in render
result = block.nodelist.render(context)
File "django/template/base.py", line 1008, in render
return SafeString("".join([node.render_annotated(context) for node in self]))
File "django/template/base.py", line 1008, in <listcomp>
return SafeString("".join([node.render_annotated(context) for node in self]))
File "django/template/base.py", line 969, in render_annotated
return self.render(context)
File "django/template/loader_tags.py", line 65, in render
result = block.nodelist.render(context)
File "django/template/base.py", line 1008, in render
return SafeString("".join([node.render_annotated(context) for node in self]))
File "django/template/base.py", line 1008, in <listcomp>
return SafeString("".join([node.render_annotated(context) for node in self]))
File "django/template/base.py", line 969, in render_annotated
return self.render(context)
File "django/template/loader_tags.py", line 65, in render
result = block.nodelist.render(context)
File "django/template/base.py", line 1008, in render
return SafeString("".join([node.render_annotated(context) for node in self]))
File "django/template/base.py", line 1008, in <listcomp>
return SafeString("".join([node.render_annotated(context) for node in self]))
File "django/template/base.py", line 969, in render_annotated
return self.render(context)
File "django/template/loader_tags.py", line 65, in render
result = block.nodelist.render(context)
File "django/template/base.py", line 1008, in render
return SafeString("".join([node.render_annotated(context) for node in self]))
File "django/template/base.py", line 1008, in <listcomp>
return SafeString("".join([node.render_annotated(context) for node in self]))
File "django/template/base.py", line 969, in render_annotated
return self.render(context)
File "django/template/defaulttags.py", line 550, in render
return self.nodelist.render(context)
File "django/template/base.py", line 1008, in render
return SafeString("".join([node.render_annotated(context) for node in self]))
File "django/template/base.py", line 1008, in <listcomp>
return SafeString("".join([node.render_annotated(context) for node in self]))
File "django/template/base.py", line 969, in render_annotated
return self.render(context)
File "django/template/loader_tags.py", line 65, in render
result = block.nodelist.render(context)
File "django/template/base.py", line 1008, in render
return SafeString("".join([node.render_annotated(context) for node in self]))
File "django/template/base.py", line 1008, in <listcomp>
return SafeString("".join([node.render_annotated(context) for node in self]))
File "django/template/base.py", line 969, in render_annotated
return self.render(context)
File "classytags/core.py", line 142, in render
return str(self.render_tag(context, **kwargs))
File "cms/templatetags/cms_tags.py", line 296, in render_tag
content = renderer.render_obj_placeholder(
File "cms/plugin_rendering.py", line 336, in render_obj_placeholder
return self.render_page_placeholder(
File "cms/plugin_rendering.py", line 373, in render_page_placeholder
self._preload_placeholders_for_page(current_page)
File "cms/plugin_rendering.py", line 589, in _preload_placeholders_for_page
placeholders = self._get_content_object(page, slots=slots)
File "cms/plugin_rendering.py", line 576, in _get_content_object
PageContent.page.field.set_cached_value(page_content, page)
File "django/db/models/fields/mixins.py", line 47, in set_cached_value
instance._state.fields_cache[self.cache_name] = value
Expected behaviour
Not sure what should really happen. On the one hand, the page could be opened on its correct domain, even if the editor would then have to log in again. Alternatively, the view can set the correct site context, but this could certainly cause other problems.
Additional information (CMS/Python/Django versions)
- CPython 3.11.10
- Django 5.1.3
- Django-CMS 4.1.4
Do you want to help fix this issue?
- Yes, I want to help fix this issue and I will join the channel #pr-reviews on the Discord Server to confirm with the community that a PR is welcome.
I will do my very best. - No, I only want to report the issue.
CarwynNelson and Will-Hoey