Django是Python主流的Web框架之一,目前主要版本是Django 2.1,但是很多扩展都是基于Django 1.x。最近想做个简单的Web发布,选择了Wagtail,因为其他两个主流的cms系统django-cms、mezzanine都不支持Django 2.x。由于项目需要,要将Wagtail整合进原来的Django项目中。(说个题外话,如果有时间敲代码,还是建议自己敲代码开发项目,用各种免费扩展然后去修改,处处是坑)
思路是先用Wagtail创建项目文件夹,再拷贝到django2里手工创建项目整合。
作为独立站安装
依次执行以下代码:
$ pip install wagtail
$ wagtail start mysite
$ cd mysite
$ pip install -r requirements.txt
$ python manage.py migrate
$ python manage.py createsuperuser
...(等下输入用户名密码等信息)
$ python manage.py runserver
创建项目:
$ python manage.py startapp cmssite
执行完这一步之后,mysite文件夹下就有个cmssite文件夹,现在可以停止掉Wagtail服务了。
手工创建项目进行整合
将cmssite文件夹拷贝到Django根目录(我的是D:\dsites\)下,作为你的项目。将Wagtail的mysite\mysite\templates下面的base.html拷贝到Django的templates文件夹里。(这是坑点之一)
到setting.py里 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.core',
'modelcluster',
'taggit',
'cmssite',
MIDDLEWARE添加:
'wagtail.core.middleware.SiteMiddleware',
'wagtail.contrib.redirects.middleware.RedirectMiddleware',
如果你之前没有设置STATIC_ROOT,则要添加:
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
添加WAGTAIL_SITE_NAME:
WAGTAIL_SITE_NAME = '站点名称'
在根目录创建media文件夹(就是cmssite并列的文件夹),并添加:
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
配置urls.py(可以根据自己需要设置):
from django.urls import path, re_path, include
from wagtail.admin import urls as wagtailadmin_urls
from wagtail.documents import urls as wagtaildocs_urls
from wagtail.core import urls as wagtail_urls
urlpatterns = [
...(你原来配置)
re_path(r'^cms/', include(wagtailadmin_urls)),
re_path(r'^documents/', include(wagtaildocs_urls)),
re_path(r'^news/', include(wagtail_urls)),
]
这样,cmssite的首页就是/news/,管理页面是/cms/
在model.py页面建立一个模型,比如HomePage:
from django.db import models
from wagtail.core.models import Page
from wagtail.core.fields import RichTextField
from wagtail.admin.edit_handlers import FieldPanel
class HomePage(Page):
body = RichTextField(blank=True)
content_panels = Page.content_panels + [
FieldPanel('body', classname="full"),
]
对应的,在你的templates文件夹下创建一个cmssite文件夹,然后创建一个home_page.html
{% extends "base.html" %}
{% load wagtailcore_tags %}
{% block body_class %}template-homepage{% endblock %}
{% block content %}
{{ page.body|richtext }}
{% endblock %}
然后,命令行执行:
$ python manage.py makemigrations
$ python manage.py migrate
$ python manage.py runserver 8080
然后/cms/进入管理界面,进入settings > sites
配置默认站点,Root page一定要选择刚才的 home_page (这是坑点之二,你肯定一直想在urls.py里配置入口)
接下来你就可以在cmssite里继续倒腾了。
总结
Wagtail是基于Django的,但是对Django做了很多封装简化,比如取消了内部urls配置,取消了views(直接让model绑定了template),貌似简单了,但是留下了很多坑点,如果以Django的思维去处理Wagtail就会遇到很多麻烦。当然了,Wagtail里面还是可以用Django方式来开发的。