既存のDjangoプロジェクトにWagtail CMSを導入する方法

Wagtail CMSをすでに動いているDjangoプロジェクトに導入する方法を解説します。

既存のDjangoプロジェクトにWagtail CMSを導入する方法

Wagtail CMSとは?

Wagtailは、Pythonで実装されたオープンソースのCMS(コンテンツマネジメントシステム)です。WebフレームワークのDjangoをもとに作成されているため、柔軟なカスタマイズと直感的なUIが特徴で、Python製のCMSとしては世界で最も人気があります。

Wagtail CMSを既存プロジェクトに導入する方法

Wagtailwagtail startコマンドでテンプレートをもとに新規プロジェクトを立ち上げることができます。初めからWagtailの導入を予定しているならその方法が便利です。wagtail startを利用する方法は『Wagtailで新しいプロジェクトを作成する』で解説しています。

一方で、すでに動いているDjangoのプロジェクトにあとからWagtailを導入することも可能です。Djangoで開発したWebサービスにCMSの機能を追加するといったことが簡単にできます。

まずはpipでWagtailをインストールしましょう。

$ pip install wagtail

settings.pyの設定

設定ファイルに以下の記述を追加します。

INSTALLED_APPSMIDDLEWAREに以下の内容を追加してください。これらのアプリケーションは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_ROOTMEDIA_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モデルにも対応しています。AbstractBaseUserPermissionsMixinを継承したUserモデルであればそのまま利用できます。カスタムUserモデルを利用する際にはそれらのクラスを継承するのは一般的ですので、それほど気にする必要はありません。

アプリケーションを作成する

ここまでの設定でWagtailの導入は完了です。

通常のDjangoプロジェクトと同じようにpython manage.py startappでアプリケーションを作り、WagtailのPageモデルを継承させたモデルを実装することで、WagtailのAdminで管理することができるページを作成することができます。