How To Prevent Users From Creating Certain Page Types in Wagtail CMS

25 Oct · by Tim Kamanin · 2 min read

Sometimes in Wagtail, we have pages that should only have a single instance in the system. Let's say we have a blog that has an index page driven by BlogIndexPage model. We create it once and want to prevent editors from creating a second instance of BlogIndexPage. How do we do that?

Every Wagtail Page model has a handy flag called is_creatable, by default it's set to True. So if we want to prevent a certain type of pages to be creatable via the admin interface, we just need to set is_creatable to True in the page type class.

Thus in our case, with BlogIndexPage we do this:

from wagtail.core.models import Page

class BlogIndexPage(Page):
   is_creatable = False

And now editors can't add BlogIndexPage instances anymore.

Tip

The thing is, you might want to add is_creatable = False to many more model classes and it's always hard to keep up with these settings, especially when you want to turn it on for a moment. I came up with the following solution to the problem: I use a global setting to lock/unlock my models:

class BlogIndexPage(Page):
    is_creatable = settings.WAGTAIL_PAGES_IS_CREATABLE

Now, with a single change in settings.py I can set models to be creatable or not:

In settings.py:

WAGTAIL_PAGES_IS_CREATABLE = True # or False

The even better idea is to drive this setting via Environment variables, so you don't have to re-deploy every time you want to change the setting, In settings.py I set

WAGTAIL_PAGES_IS_CREATABLE = os.environ.get('WAGTAIL_PAGES_IS_CREATABLE', False)

Voila! Enjoy Wagtail CMS, it's really cool!

Want to get more 🔥 tips like this one?

Subscribe to get notified about new dev tutorials

Comments