Skip to content

Instantly share code, notes, and snippets.

@veuncent
Last active June 26, 2024 03:14
Show Gist options
  • Save veuncent/9dab311125401c1886eb7c6998f5f387 to your computer and use it in GitHub Desktop.
Save veuncent/9dab311125401c1886eb7c6998f5f387 to your computer and use it in GitHub Desktop.
Set wagtail (home)pages programmatically during Django Migrations
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
from wagtail.wagtailcore.models import Page, Site
def forwards_func(apps, schema_editor):
HomePage = apps.get_model('website', 'HomePage')
NewsIndexPage = apps.get_model('website', 'NewsIndexPage')
NewsPage = apps.get_model('website', 'NewsPage')
NewsTagIndexPage = apps.get_model('website', 'NewsTagIndexPage')
try:
default_home = Page.objects.filter(title="Welcome to your new Wagtail site!")[0]
default_home.slug = "home-old"
default_home.save_revision().publish()
default_home.save()
except:
pass
home_page = HomePage(
title="Home",
slug="home",
)
news_index_page = NewsIndexPage(
title="News",
slug="news"
)
news_page = NewsPage(
title="This is a News Page",
date="2017-08-15",
slug="news-article-1"
)
tag_index_page = NewsTagIndexPage(
title="Tags",
slug="tags"
)
# Set Home Page as child of root
root = Page.objects.get(id=1).specific
root.add_child(instance=home_page)
# Save and publish Home Page
revision = home_page.save_revision()
revision.publish()
home_page.save()
# Set Home Page as root page for Site
site = Site.objects.get(id=1)
site.root_page = home_page
site.save()
# Add News Index as child of Home Page
home_page.add_child(instance=news_index_page)
news_index_page.save_revision().publish()
news_index_page.save()
# Add News Page as child of News Index
news_index_page.add_child(instance=news_page)
news_page.save_revision().publish()
news_page.save()
# Add Tag Index as child of Home Page
home_page.add_child(instance=tag_index_page)
tag_index_page.save_revision().publish()
tag_index_page.save()
try:
default_home = Page.objects.filter(title="Welcome to your new Wagtail site!")[0]
default_home.delete()
except:
pass
def reverse_func(apps, schema_editor):
current_home_page = Page.objects.get(slug="home")
current_home_page.slug = "home-old"
current_home_page.save_revision().publish()
current_home_page.save()
default_home_page = Page(
title="Welcome to your new Wagtail site!",
slug="home"
)
# Free up the /home slug, but do not delete the old Home Page
current_home_page = Page.objects.get(slug="home")
current_home_page.slug = "home-old"
current_home_page.save_revision().publish()
current_home_page.save()
default_home_page = Page(
title="Welcome to your new Wagtail site!",
slug="home"
)
# Set default Home Page as child of root
root = Page.objects.get(id=1).specific
root.add_child(instance=default_home_page)
# Save default Home Page
revision = default_home_page.save_revision()
revision.publish()
default_home_page.save()
# Set default Home Page as root page for Site
site = Site.objects.get(id=1)
site.root_page = default_home_page
site.save()
# Delete current Home Page (and everything beneath it!)
current_home_page.delete()
class Migration(migrations.Migration):
dependencies = [
('website', '0007_some_other_migration'),
]
operations = [
migrations.RunPython(forwards_func, reverse_func),
]
@veuncent
Copy link
Author

veuncent commented Oct 18, 2017

Can also be created as a management command instead

@alvindera97
Copy link

Apparently, during tests with setting root_page for a site object, there is an Internal server error if you make a call to site.save(). If the root_page you are trying to add has StreamField data, it fails with the [honestly useless] internal server error page.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment