Skip to main content

Latest PyPI version Test coverage Django versions django CMS versions License

djangocms-rest

djangocms-rest enables frontend projects to consume django CMS content through a browsable, read-only REST/JSON API. Built on Django REST Framework (DRF) with OpenAPI 3 schema generation via drf-spectacular.

Key Features

  • Easy integration – Integrates effortlessly into existing Django CMS projects
  • REST API – DRF-based API exposing Django CMS content for SPAs, static sites, and mobile apps
  • Typed Endpoints – Auto-generate OpenAPI schemas for page data and plugin content
  • Plugin Serialization – Basic support for all CMS plugins, easily extendable for custom needs
  • Multi-Site Support – Serve multiple websites from a single instance with isolated API responses
  • Multi-language Content – Use the robust i18n integration of Django CMS in your frontend
  • Preview & Draft Access – Fetch unpublished or draft content in your frontend for editing previews
  • Permissions & Authentication – Uses DRF and Django permissions for secure access control
  • Menus & Breadcrumbs – Exposes the built-in navigation handlers from Django CMS
  • Caching & Performance – Works with Django cache backends like Redis and Memcached

Requirements

  • Python >= 3.10, < 3.14
  • Django >= 4.2, < 6.1
  • Django CMS >= 4.1, < 5.1

Installation

Install using pip:

pip install djangocms-rest

Update your INSTALLED_APPS setting:

INSTALLED_APPS = [
    ...
    "djangocms_rest",
    ...
]

rest_framework is installed as a dependency. Add it to INSTALLED_APPS if you want to use the browsable API UI or create additional DRF endpoints beyond djangocms-rest.

Add the API endpoints to your project's urls.py:

from django.urls import path, include

urlpatterns = [
    ...
    path('api/', include('djangocms_rest.urls')),
    ...
]

Using api/cms/ as the path helps separate djangocms-rest endpoints in API documentation and frontend implementation.

Usage

Make sure you have existing pages. If rest_framework is in INSTALLED_APPS, you can navigate to Django REST Framework's browsable API at http://localhost:8000/api/.

Documentation

  • Getting Started – Quick start guide and installation instructions
  • OpenAPI Support – Schema generation and API documentation setup
  • How-to Guides – Multi-site configuration, plugin creation, and serialization
  • API Reference – Complete endpoint documentation

See the full documentation for details.

Headless Mode

What is headless mode?

A Headless CMS (Content Management System) is a backend-only content management system that provides content through APIs, making it decoupled from the frontend presentation layer. This allows developers to deliver content to any device or platform, such as websites, mobile apps, or IoT devices, using any technology stack. By separating content management from content presentation, a Headless CMS offers greater flexibility and scalability in delivering content.

Used with drf-spectacular, djangocms-rest generates complete OpenAPI schemas for both DRF endpoints and Django CMS content plugins. This allows seamless, typed integration with TypeScript-friendly frameworks.

Benefits

  • Decouple frontend and backend development—use any frontend framework (React, Vue, Angular, Next.js, Nuxt, SvelteKit, Remix, Astro, etc.)
  • Serve content to multiple platforms (web, mobile, IoT) via REST/JSON APIs
  • Improved performance through optimized frontend rendering
  • Content updates propagate across all platforms without frontend deployments
  • Easier integration with modern frameworks and third-party services

Considerations

  • Inline editing and content preview are available as JSON views on both edit and preview mode. Turn JSON rendering on and off using the REST_JSON_RENDERING setting.
  • Use Structure Mode in CMS to directly edit content in the frontend when the decoupled view is embedded as an iframe.
  • The API focuses on fetching plugin content and page structure as JSON data. Apphook logic must be implemented using custom logic.
  • Website rendering is entirely decoupled and must be implemented in the frontend framework.

FAQ

Are there JavaScript packages for drop-in support of frontend editing in the JavaScript framework of my choice?

The good news first: django CMS headless mode is fully backend supported and works independently of the javascript framework. It is fully compatible with the javascript framework of your choosing.

How can I implement a plugin for headless mode?

It's pretty much the same as for a traditional django CMS project, see here for instructions on how to create django CMS plugins.

Let's have an example. Here is a simple plugin with two fields to render a custom header. Please note that the template included is just a simple visual helper to support editors to manage content in the django CMS backend. Also, backend developers can now toy around and test their django CMS code independently of a frontend project.

After setting up djangocms-rest and creating such a plugin you can now run the project and see a REST/JSON representation of your content in your browser, ready for consumption by a decoupled frontend.

cms_plugins.py:

# -*- coding: utf-8 -*-
from cms.plugin_base import CMSPluginBase
from cms.plugin_pool import plugin_pool

from . import models


class CustomHeadingPlugin(CMSPluginBase):
    model = models.CustomHeadingPluginModel
    module = 'Layout Helpers'
    name = "My Custom Heading"

    # this is just a simple, unstyled helper rendering so editors can manage content
    render_template = 'custom_heading_plugin/plugins/custom-heading.html'

    allow_children = False


plugin_pool.register_plugin(CustomHeadingPlugin)

models.py:

from cms.models.pluginmodel import CMSPlugin
from django.db import models


class CustomHeadingPluginModel(CMSPlugin):

    heading_text = models.CharField(
        max_length=256,
    )

    size = models.PositiveIntegerField(default=1)

templates/custom_heading_plugin/plugins/custom-heading.html:

<h{{ instance.size }} class="custom-header">{{ instance.heading_text }}</h{{ instance.size }}>

Do default plugins support headless mode out of the box?

Yes, djangocms-rest provides out of the box support for any and all django CMS plugins whose content can be serialized.

Custom DRF serializers can be declared for custom plugins by setting its serializer_class property.

Does the TextPlugin (Rich Text Editor, RTE) provide a JSON representation of the rich text?

Yes, djangocms-text has both HTML blob and structured JSON support for rich text.

URLs to other Django model objects are dynamic and resolved to API endpoints if possible. If the referenced model provides a get_api_endpoint() method, it is used for resolution. If not, djangocms-rest tries to reverse <model-name>-detail. If resolution fails dynamic objects are returned in the form of <app-name>.<object-name>:<uid>, for example cms.page:2. The frontend can then use this to resolve the object and create the appropriate URLs to the object's frontend representation.

I don't need pages, I just have a fixed number of content areas in my frontend application for which I need CMS support.

Absolutely, you can use the djangocms-aliases package. It allows you to define custom placeholders that are not linked to any pages. djangocms-rest will then make a list of those aliases and their content available via the REST API.

OpenAPI 3 Support

djangocms-rest supports OpenAPI 3 schema generation for Django REST framework and type generation for all endpoints and installed plugins using drf-spectacular.

API Endpoints

The following endpoints are available:

Public API

Endpoints Description
/api/languages/ Fetch available languages for the site
/api/plugins/ Fetch plugin type definitions for frontend type checks
/api/{language}/pages/ Fetch the root page for a given language
/api/{language}/pages-tree/ Fetch complete page tree (suitable for smaller projects)
/api/{language}/pages-list/ Fetch paginated page list with limit and offset support
/api/{language}/pages/{path}/ Fetch page details by path
/api/{language}/page_search/ Search pages by query term
/api/{language}/placeholders/{content_type_id}/{object_id}/{slot}/ Fetch placeholder content (supports ?html=1 for rendered HTML)
/api/{language}/menu/... Fetch menu navigation (supports optional {from_level}/{to_level}/{extra_inactive}/{extra_active}, {root_id}, and {path} parameters)
/api/{language}/submenu/... Fetch submenu navigation (supports optional {levels}, {root_level}, {nephews}, and {path} parameters)
/api/{language}/breadcrumbs/... Fetch breadcrumb navigation (supports optional {start_level} and {path} parameters)
/api/healthcheck/ Health check endpoint for monitoring tools

Documentation For complete endpoint documentation, request/response schemas, and authentication details, see the API Reference.

Private API (Preview)

For all page related endpoints draft content can be fetched, if the user has the permission to view preview content. To determine permissions user_can_view_page() from djangocms is used, usually editors with is_staff are allowed to view draft content.

Just add the ?preview GET parameter to the above page, page-tree, or page-list endpoints.

Sample API-Response: api/{en}/pages/{sub}/

GET CONTENT using /api/{language}/placeholders/{content_type_id}/{object_id}/{slot}/

{
    "title": "sub",
    "page_title": "sub",
    "menu_title": "sub",
    "meta_description": "",
    "redirect": null,
    "in_navigation": true,
    "soft_root": false,
    "template": "home.html",
    "xframe_options": "",
    "limit_visibility_in_menu": false,
    "language": "en",
    "path": "sub",
    "absolute_url": "/sub/",
    "is_home": false,
    "login_required": false,
    "languages": [
        "en"
    ],
    "is_preview": false,
    "application_namespace": null,
    "creation_date": "2025-02-27T16:49:01.180050Z",
    "changed_date": "2025-02-27T16:49:01.180214Z",
    "placeholders": [
        {
            "content_type_id": 5,
            "object_id": 6,
            "slot": "content"
        },
        {
            "content_type_id": 5,
            "object_id": 6,
            "slot": "cta"
        }
    ]
}

Sample API-Response: api/{en}/placeholders/{5}/{6}/{content}/[?html=1]

Rendered HTML with an optional flag ?html=1

{
    "slot": "content",
    "label": "Content",
    "language": "en",
    "content": [
        {
            "plugin_type": "TextPlugin",
            "body": "<p>Test Content</p>",
            "json": { ... },
            "rte": "tiptap"
        }
    ],
    "html": "<p>Test Content</p>"
}

OpenAPI Type Generation

Use the provided schema to quickly generate generate clients, SDKs, validators, and more.

TypeScript : https://github.com/hey-api/openapi-ts

Contributing

Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.

License

BSD-3

Metadata

Release files for djangocms-rest 1.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for djangocms-rest 1.2.0
File Size Uploaded Provenance
djangocms_rest-1.2.0.tar.gz 41.5 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for djangocms-rest 1.2.0
File Interpreter ABI Platform
djangocms_rest-1.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 74.8 kB

Release files / djangocms_rest-1.2.0.tar.gz

Download URL djangocms_rest-1.2.0.tar.gz
Size 41.5 kB
Tags Source
SHA-256 checksum
How to use checksums
6a782f7f5c61348861dbc6bd51463b7c5e03c5b64105a5da7bfd93cab6dd13cb
BLAKE2b-256 checksum
How to use checksums
44a425ea5992b9964f88ebcb6b26323182ea0dec3cd57af35e8ac2e649d5e3eb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on May 14, 2026.

Transparency log

Release files / djangocms_rest-1.2.0-py3-none-any.whl

Download URL djangocms_rest-1.2.0-py3-none-any.whl
Size 33.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a20ad6b5f27dadd09f487cba3535257a473372078cce0bd7177aa0b849a0e788
BLAKE2b-256 checksum
How to use checksums
4533505503a76da5481276749512f24cd6ca90fc313b3cc52d02eec12c9d94c4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on May 14, 2026.

Transparency log

Security for djangocms-rest 1.2.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for djangocms_rest-1.2.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on May 14, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page