Understand the Grouper / Content pattern
maindjango CMS uses a split architecture for all editable entities (pages, aliases, blog posts, etc.) to handle translations and versioning efficiently. Every content object consists of two cooperating parts:
- Grouper: Holds the long-lived identity of the object. It represents the 'noun' (e.g., this page exists at this position in the tree). It survives translations, versions, and edits. Typical fields include
site, tree position,is_home, andapplication_urls. - Content: Holds the editable state for a specific combination of language × version. It represents the 'adjective' (e.g., this title, this template, this set of placeholders). There are many content rows per one grouper.
This split ensures that a page's URL and position in the tree remain stable even when editors create new translations or publish new versions.