A Django content management system with a user-friendly interface and powerful features for building websites and applications.
npx @tessl/cli install tessl/pypi-wagtail@6.4.0A Django content management system focused on user experience, offering precise control for designers and developers. Wagtail provides a comprehensive CMS framework with a fast and attractive interface for content authors, complete control over front-end design, and powerful content management capabilities.
pip install wagtailimport wagtail
from wagtail.models import PageCommon imports for building pages:
from wagtail.models import Page
from wagtail.fields import RichTextField, StreamField
from wagtail.blocks import CharBlock, TextBlock, StructBlock
from wagtail.admin.panels import FieldPanel, MultiFieldPanelfrom wagtail.models import Page
from wagtail.fields import RichTextField
from wagtail.admin.panels import FieldPanel
# Create a basic page model
class BlogPage(Page):
body = RichTextField(blank=True)
content_panels = Page.content_panels + [
FieldPanel('body'),
]
# In your Django settings
INSTALLED_APPS = [
'wagtail.contrib.forms',
'wagtail.contrib.redirects',
'wagtail.embeds',
'wagtail.sites',
'wagtail.users',
'wagtail.snippets',
'wagtail.documents',
'wagtail.images',
'wagtail.search',
'wagtail.admin',
'wagtail',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
# ... other Django apps
]
# URL configuration
from wagtail import urls as wagtail_urls
from wagtail.admin import urls as wagtailadmin_urls
urlpatterns = [
path('admin/', admin.site.urls),
path('cms/', include(wagtailadmin_urls)),
path('', include(wagtail_urls)),
]Wagtail's architecture is built on Django's foundation with key components:
This design provides a scalable CMS that integrates seamlessly with Django applications while offering rich content management capabilities.
Core page functionality including the Page model hierarchy, content fields, and tree-based organization. Provides the foundation for all content in Wagtail.
class Page(MP_Node):
title: str
slug: str
live: bool
def get_url(self, request=None, current_site=None): ...
def serve(self, request): ...
def get_context(self, request): ...Flexible content field types including RichTextField and StreamField with structured content blocks for building dynamic page layouts.
class RichTextField(models.TextField):
def __init__(self, editor='default', features=None, **kwargs): ...
class StreamField(models.Field):
def __init__(self, block_types, **kwargs): ...Customizable admin interface with panel system for organizing edit forms, menu configuration, and admin UI extensions.
class FieldPanel:
def __init__(self, field_name, widget=None, **kwargs): ...
class MultiFieldPanel:
def __init__(self, children, heading='', **kwargs): ...Full-text search capabilities with configurable backends, search field configuration, and query interfaces.
class SearchField:
def __init__(self, field_name, partial_match=True, boost=1): ...
class Indexed:
search_fields: listMedia management with image processing, renditions, document handling, and collection-based organization.
class Image(AbstractImage):
def get_rendition(self, filter): ...
class Document(AbstractDocument):
title: str
file: FileFieldREST API endpoints for headless CMS functionality with serializers for pages, images, and documents.
class PagesAPIViewSet(BaseAPIViewSet):
def get_queryset(self): ...
class APIField:
def __init__(self, name, serializer=None): ...Content approval workflows with task-based moderation, publishing controls, and revision management.
class Workflow(models.Model):
def start(self, page, user): ...
class Task(models.Model):
def start(self, workflow_state, user): ...Template tags for page URLs, content rendering, and template utilities for building Wagtail-powered front-ends.
def pageurl(page, request=None): ...
def include_block(block_value): ...Additional functionality modules that extend Wagtail's core capabilities with forms, redirects, settings management, and specialized content types.
@register_snippet
class Category(models.Model):
name: str
class AbstractForm(Page):
def get_form(self): ...
def process_form_submission(self, form): ...Signals, hooks, and utilities for customizing Wagtail behavior, integrating with external systems, and extending functionality.
@hooks.register('construct_main_menu')
def add_menu_items(request, menu_items): ...
page_published.connect(my_handler)