wagtail简介
wagtail是一个基于Django的无头CMS,可以方便的利用Django的基本特性进行CMS后端的开发。所谓无头,是指只有后端没有前端,或者说,前后端是分离的。当然这并不意味着wagtail无法在前端展示页面,事实上,wagtail和Django一样,有一整套完成的前端展示语法。
wagtail可以定制文章发布后端,并且和Django语法兼容,对于不喜欢wordpress这类完全成品化的CMS系统的强迫症患者来说,是一个非常不错的选择。
wagtail官网全是英文,对英语不太好的同学不是特别友好。本文就在官方入门教程的基础之上,从头开始试用一下wagtail的各项功能。
本文基于ubuntu系统进行介绍,并且假设已经安装好了python的最新版本(实验环境的版本是3.12)。
创建虚拟环境
wagtail建议使用虚拟环境进行开发。虚拟环境提供了一个虚拟的空间,所有项目的依赖都可以安装在虚拟环境中,不会受到其他项目的影响,也不会影响其他项目。而外部项目也无法使用虚拟环境中的依赖项。
换言之,虚拟环境为多项目开发提供了便利,使得不同项目之间可以相互不影响的独立进行开发。也避免了由于软件升级造成项目不可用。
可以通过python的venv进行创建。如果命令不可用,则需要在系统中通过“sudo apt install python3-venv”进行安装。
#在mysite目录下创建虚拟环境
python -m venv mysite/env
#启动虚拟环境
source mysite/env/bin/activate
为了避免每次登录都需要手动输入命令进入虚拟环境,可以将启动命令“source mysite/env/bin/activate”放到~/.bashrc文件的最后。
官方也给出了windows上的创建方法:
py -m venv mysite\env
# then
mysite\env\Scripts\activate.bat
# 如果 mysite\env\Scripts\activate.bat 没有工作,那就运行下面代码:
mysite\env\Scripts\activate
安装wagtail
pip install wagtail
创建项目
wagtail提供了一个类似于“django-admin startproject”的启动命令。直接在项目中运行“wagtail start mysite”,则会创建一个新的mysite项目。
由于我们在创建虚拟环境的时候,已经创建了一个mysite文件夹,我们可以在“wagtail start”命令中增加一个参数,把项目放在这个文件夹下。
# wagtail start project_name [dest_dir]
wagtail start mysite mysite
这个命令中,第一个参数是项目名称,第二个参数是项目路径。
创建完成后的文件目录如下:
── mysite
├── Dockerfile
├── env
├── home
├── manage.py
├── mysite
├── requirements.txt
└── search
安装依赖项
按官网的说法,在创建项目后,为了确保已安装正确的wagtail和django版本,以及其他依赖项,需要再次运行pip命令进行安装。requirements.txt包含了所需要的依赖项。
cd mysite
pip install -r requirements.txt
事实上,可以通过“django-admin --version”和“watail --version”来查看是否已经正常安装。如果是新安装,这个步骤不是必须的。如果你已开发完成,并且后面wagtail等的版本升级了,为了保持与开发环境的一致,这一步骤就是必须的了。
创建数据库
默认情况下,wagtail和django一样使用sqlite数据库。第一次使用的时候,需要对数据库进行初始化。
python manage.py migrate
输入命令并运行,wagtail会在数据库中创建与模型相匹配的表格。在开发过程中,每创建一个模型,我们都需要运行“python manage.py migrate”更新数据库,在数据库创建与之相对应的表格。
创建管理员
python manage.py createsuperuser
输入命令并运行,根据提示创建超级管理员账号。如果输入密码少于8位,会建议你至少输入8位密码。如果要坚持简单密码,需要进行再次确认。
中文支持
为了让wagtail的管理页面显示中文,还需要做一些修改,把时区和语言变更为中国。
进入mysite/settings/base.py,找到“LANGUAGE_CODE”和“TIME_ZONE”,变更为如下内容:
LANGUAGE_CODE = "zh-Hans"
TIME_ZONE = "Asia/Shanghai"
启动服务
python manage.py runserver
启动后,输入http://127.0.0.1:8000 ,就会看到一个启动页面。
如果在是远程服务器上进行开发,可以指定访问IP,也可以使用0.0.0.0(可以简单写一个0)直接接受所有IP访问。
python manage.py runserver 0:8000
访问http://你的IP:8000
如果一切正常,则会显示wagtail默认的首页。
后面管理页面的地址是http://你的IP:8000/admin
在登录页面输入刚刚创建的超级管理员用户名和密码,登录成功后进入后台管理。
编辑首页
接下来,我们来编辑一下我们项目的首页。默认的,wagtail会有一个名字叫home的应用。和Django一样,应用会有一个模型,通过model.py进行定义。
定义模型
编辑home/model.py ,添加一个body字段。
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(verbose_name="主页", blank=True)
content_panels = Page.content_panels + [
FieldPanel('body'),
]
body字段是一个RichTextField类型,是wagtail的一个特殊的富文本类型。verbose_name是显示在编辑页上的该字段的名称;设置blank=True,代表这个字段可以为空。
content_panels字段是Page类的一个属性,将body字段添加到content_panels意味着可以在管理页面编辑。
运行migrate命令将字段写入数据库:
# 创建migrations文件
python manage.py makemigrations
# 将字段更新到数据库中
python manage.py migrate
下面是预期的输出内容:
模型创建完成后,就可以进入管理页面了进行编辑了。打开管理页面的侧边栏,点击页面,弹出来的Home页旁边有个铅笔图标,可以点击进行编辑。
点击铅笔图标后,显示Home的编辑页:
我们看到的“主页”就是我们的body字段里的verbose_name。在输入框里输入一段话,然后点击发布。
此时你继续点击“实时查看”,你会发现,什么都没有改变,还是我们最开始的首页。那是因为我们还没有对前端的首页模版(template)进行修改。我们在后端字段里输入的信息还没有办法显示出来。
编辑模版
wagtail采用和Django一样的模版(template)寻找规则。在默认情况下,采用“<应用>/<模型名>_<视图名>.html”命名约定来查找模版。例如,在一个名为blog的应用中有一个名为PostCreate的视图,它将使用blog/post_create.html作为默认的模板名称。在我们这个案例中, home应用中的HomePage模型就使用home/home_page.html
.
当然,和Django一样,我们也可以使用自定义的方式命名,然后在模型类中使用“template_name = 'custom_template.html'”这个字段来指定自定义模版。
编辑“home/templates/home/home_page.html”文件,用以下内容替换:
{% extends "base.html" %}
<!-- 加载wagtail支持的标签 -->
{% load wagtailcore_tags %}
{% block body_class %}template-homepage{% endblock %}
<!-- 显示刚刚添加的内容 -->
{% block content %}
{{ page.body|richtext }}
{% endblock %}
extends 标签表明引用一个父类模版,通过继承父类模版,可以大大简化页面的开发工作。我们可以把一些通用的内容放在父类模版中,而把一些个性化的页面放在block标签中。
load标签加载了wagtail的标签类,便于在模版中引用标签的一些功能。
现在我们点击查看页面,或者直接进入主页,就可以看到我们刚刚输入的文字了:
wagtail模版标签简介
除了Django模版中的标签和过滤器,wagtail也提供了许多它自身的标签和过滤器。这些标签和过滤器可以通过在模版的顶部添加{% load wagtailcore_tags %}
生效。
这个案例就通过richtext的过滤器输出富文本内容:
{% load wagtailcore_tags %}
{{ page.body|richtext }}
以上内容解析成:
<p>欢迎访问我的第一个页面</p>
以上就是wagtail入门教程的第一部分。下一部分,我们将继续跟随wagtail的官网教程学习,创建一个博客。在创建的过程中,我们可以知道wagtail如何实现分类、打标签、输入图片等功能。