
Wagtail 是一个开源的内容管理系统(CMS),基于 Python 的 Django 框架构建。它专为开发者、设计师和内容编辑者设计,提供了一个灵活、高效的平台,用于创建和管理网站内容。Wagtail 以其直观的编辑界面和强劲的扩展性而闻名,被广泛用于企业级内容管理,而无需锁定在特定模板或结构中。 它支持从简单博客到复杂的企业网站的一切需求,已被 NASA、Google、NHS(英国国家医疗服务体系)、Oxfam、Mozilla 和 MIT 等知名组织采用。
Wagtail 于 2011 年由英国数字机构 Torchbox 开发,作为 Django 的 CMS 扩展。它最初是为了解决 Torchbox 内部的内容管理需求而创建的,随着开源社区的贡献,迅速成长为一个成熟的 CMS 项目。截至 2025 年,Wagtail 已发展到 7.x 版本,拥有活跃的社区支持,包括每月新闻通讯和专业服务。它的设计哲学强调“编辑者友善”和“开发者自由”,避免了传统 CMS 的复杂性和锁定问题。

Wagtail 的核心优势在于平衡了编辑者的创意控制与开发者的灵活性。以下是其主要特性:
特性 | 描述 |
StreamField | 一个创新的编辑界面,允许编辑者自由组合文本、图像、视频等内容块,而无需开发者干预。适合博客或新闻页面。 |
开发者灵活性 | 基于 Django,支持 Python 的一切功能。只需几行代码即可添加新内容类型。 |
前端自由 | 提供简单的模板系统,设计师可以准确控制样式,支持 headless(无头)模式。 |
无锁定费用 | 开源免费,无许可费;全球专业机构(如 Torchbox)提供支持。 |
编辑器控制 | 直观的 admin 界面,支持富文本编辑、图像管理、表单和搜索,提升生产力。 |
多站点支持 | 轻松管理多个网站,如 Cambridge University Hospitals 的多站点设置。 |
Wagtail 的架构建立在 Django 之上,使用 MVT(Model-View-Template)模式。核心是页面模型(Page),它继承 Django 的模型系统,支持树状结构(页面层级)。它集成 Wagtail 的扩展,如 Wagtail API(用于 headless CMS)和搜索模块(基于 Elasticsearch 或 PostgreSQL)。与其他 CMS 不同,Wagtail 强调“内容即代码”,允许开发者通过 Python 类定义内容结构,而非固定表单。

Wagtail 的设计围绕几个关键概念,确保内容管理和扩展的简易性:

Wagtail 的安装简单,只需 Python 环境。以下是步步指南(假设使用 Python 3.9+)。
Windows (cmd):
py -m venv mysiteenv mysiteenvScriptsactivatemacOS/Linux (bash):
python -m venv mysite/env source mysite/env/bin/activate (激活后,命令行显示 (env))。
安装 Wagtail:
pip install wagtail生成新项目:
wagtail start mysite这会创建一个 mysite 文件夹,包含基本结构(如 home/、search/、manage.py 和 requirements.txt)。
安装项目依赖:
cd mysite pip install -r requirements.txt创建数据库(默认 SQLite):
python manage.py migrate创建超级用户(admin 账户):
python manage.py createsuperuser跟随提示输入用户名、邮箱和密码。
启动服务器:
python manage.py runserver常见问题:如果 python 未识别,使用 python3 或添加 Python 到 PATH。 可选:安装 Elasticsearch 以增强搜索。
以下基于官方教程的初学者指南,逐步构建一个简单站点,包括首页扩展和基本博客。假设已完成安装。
编辑 home/models.py:
from django.db import models
from wagtail.models import Page
from wagtail.fields import RichTextField
from wagtail.admin.panels import FieldPanel
class HomePage(Page):
body = RichTextField(blank=True) # 可选的富文本字段
content_panels = Page.content_panels + [
FieldPanel('body'), # 在 admin 中添加 body 面板
]python manage.py makemigrations
python manage.py migrate{% extends "base.html" %}
{% load wagtailcore_tags %}
{% block content %}
<h1>{{ page.title }}</h1>
{{ page.body|richtext }} <!-- 渲染富文本 -->
{% endblock %}重启服务器,刷新首页查看变化。
python manage.py startapp blogINSTALLED_APPS = [
'blog', # 新添加
'home',
'search',
# ... 其他
]from django.db import models
from wagtail.models import Page
from wagtail.fields import RichTextField
from wagtail.admin.panels import FieldPanel
class BlogPage(Page):
intro = RichTextField()
body = StreamField([ # 使用 StreamField 添加混合内容
('paragraph', RichTextField()),
('image', models.ForeignKey('wagtailimages.Image', on_delete=models.CASCADE)),
])
content_panels = Page.content_panels + [
FieldPanel('intro'),
FieldPanel('body'),
]python manage.py makemigrations blog
python manage.py migrateclass BlogIndexPage(Page):
intro = RichTextField(blank=True)
content_panels = Page.content_panels + [
FieldPanel('intro'),
]
def get_context(self, request):
context = super().get_context(request)
context['posts'] = BlogPage.objects.child_of(self).live()
return context模板
blog/templates/blog/blog_index_page.html:
{% extends "base.html" %}
{% load wagtailcore_tags %}
{% for post in posts %}
<h2><a href="{% pageurl post %}">{{ post.title }}</a></h2>
{{ post.intro|richtext }}
{% endfor %}通过这些步骤,你可以快速上手 Wagtail。提议从简单页面开始,逐步添加 StreamField 和 API。