既存のDjangoプロジェクトにWagtail CMSを導入する方法
Wagtail CMSをすでに動いているDjangoプロジェクトに導入する方法を解説します。
Wagtail CMSとは?
Wagtailは、Pythonで実装されたオープンソースのCMS(コンテンツマネジメントシステム)です。WebフレームワークのDjangoをもとに作成されているため、柔軟なカスタマイズと直感的なUIが特徴で、Python製のCMSとしては世界で最も人気があります。
Wagtail CMSを既存プロジェクトに導入する方法
Wagtailはwagtail start
コマンドでテンプレートをもとに新規プロジェクトを立ち上げることができます。初めからWagtailの導入を予定しているならその方法が便利です。wagtail start
を利用する方法は『Wagtailで新しいプロジェクトを作成する』で解説しています。
一方で、すでに動いているDjangoのプロジェクトにあとからWagtailを導入することも可能です。Djangoで開発したWebサービスにCMSの機能を追加するといったことが簡単にできます。
まずはpipでWagtailをインストールしましょう。
$ pip install wagtail
settings.pyの設定
設定ファイルに以下の記述を追加します。
INSTALLED_APPS
とMIDDLEWARE
に以下の内容を追加してください。これらのアプリケーションはwagtail start
のテンプレートを利用した時と同じ内容になります。
# settings.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',
...
]
MIDDLEWARE = [
...
'wagtail.contrib.redirects.middleware.RedirectMiddleware',
]
続いて、STATIC_ROOT
を追加します。これはWagtail特有のものではなく、通常のDjangoプロジェクトでも利用するもので、デプロイ時に静的ファイルを一箇所に集めるフォルダを指定するものです。
# settings.py
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
MEDIA_ROOT
とMEDIA_URL
も設定します。これらも通常のDjangoプロジェクトで利用するもので、ユーザーのアップロード画像などのメディアファイルを管理するための設定です。すでに設定されている場合はそのままで大丈夫です。
# settings.py
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
最後にWAGTAIL_SITE_NAME
を設定します。これはWagtailの管理画面などで表示される名前の指定になります。
# settings.py
WAGTAIL_SITE_NAME = 'WagtailBase Sample Website'
urls.pyの設定
Wagtailの管理画面やWagtailのルールに基づいたPageとURLの紐付けを行うため、urls.pyの設定をします。
これらの内容はすべて追加する必要はなく、プロジェクトの要件に合わせて追記してください。例えば、PDFなどのドキュメントを扱う予定がないのであれば、wagtaildocs_urls
の追記は必要ありません。
# urls.py
from django.urls import path, re_path, include
from wagtail.admin import urls as wagtailadmin_urls
from wagtail.core import urls as wagtail_urls
from wagtail.documents import urls as wagtaildocs_urls
urlpatterns = [
...
path('cms/', include(wagtailadmin_urls)), # Wagtailの管理画面にアクセスするためのURL
path('documents/', include(wagtaildocs_urls)), # PDFなどのドキュメントを配信するURL
path('blog/', include(wagtail_urls)), # Wagtailで管理しているページを配信するURL
...
]
wagtailadmin_urls
はWagtailの管理画面のURLです。CMSの役割を担うページであり、既存のDjangoプロジェクトのAdminページ(django.contrib.admin
で設定しているもの)とは別のものです。すでに/admin/
のURLが利用されている場合には、上記のように/cms/
のようなURLを指定することができます。ちなみに、wagtail start
で新規プロジェクトを立ち上げた場合には/admin/
のURLがWagtailのAdminページ、/django-admin/
のURLが通常のDjangoのAdminページに設定されています。
wagtaildocs_urls
はPDFなどのドキュメントを配信するURLです。コーポレートサイトなどでPDF資料を配信する際などに利用できます。特に利用しない場合は設定をしなくても大丈夫です。
wagtail_urls
はWagtailによって管理されるページが配信されるURLを指定するものです。上記の例では、/blog/
というパス以下のURLをWagtailで管理することになります。例えば、これまで運営してきたサイトにブログを追加したくなり、example.com/blog/sample-article/
といったURLでブログの記事ページを追加することができるようになります。この場合、ルートURL(トップページのURL)やその他のURLでは通常のDjangoプロジェクトによって管理されており、Wagtailの管理にはならないことに注意してください。
もしルートURL以下をすべてWagtailの管理下におきたい場合には、上記のpath('blog/', include(wagtail_urls))
の記述を消して、urlpatterns
のリストに以下のコードを追加してください。このコードはurlpatterns
のリストの最後に追加することに注意してください。
# urls.py
urlpatterns = [
...
re_path(r'', include(wagtail_urls)),
]
メディアファイル向けのURLも設定する必要があります。これは開発環境でのみ利用する設定で、本番環境ではメディアファイルを配信するための設定が別途必要です。これに関してはDjangoのドキュメントを確認してください。
# urls.py
# DEBUG=True(開発環境)でのみの設定
if settings.DEBUG:
from django.conf.urls.static import static
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
設定をしたらmigrateをしてデータベースに反映させましょう。
$ python manage.py migrate
WagtailでのUserモデルの扱い
通常のDjangoのSuperuserはWagtailのAdminページを利用する権限があります。もしSuperuserを作っていない場合には以下のコマンドでSuperuserを作成しましょう。
$ python manage.py createsuperuser
WagtailはカスタムUserモデルにも対応しています。AbstractBaseUser
とPermissionsMixin
を継承したUserモデルであればそのまま利用できます。カスタムUserモデルを利用する際にはそれらのクラスを継承するのは一般的ですので、それほど気にする必要はありません。
アプリケーションを作成する
ここまでの設定でWagtailの導入は完了です。
通常のDjangoプロジェクトと同じようにpython manage.py startapp
でアプリケーションを作り、WagtailのPageモデルを継承させたモデルを実装することで、WagtailのAdminで管理することができるページを作成することができます。