Skip to content

[BUG] Preview page from other site throws 'EmptyPageContent' object has no attribute '_state' #8087

@dkoenigroer

Description

@dkoenigroer

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

  1. Open you Admin eg example.com/en/admin/
  2. Search vor CMS | Page contents and open the page tree eg example.com/en/admin/cms/pagecontent/
  3. Change the site and the tree of that site will be loaded. image
  4. Click on the eye icon of a page
  5. See the error page (local) or a 500er error page:
    image

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions