For deployment purposes, a command which can update the domain of a Wagtail website can be useful.
You can create a custom management command which helps you doing this. Start with creating a file <app>/management/commands/wagtail_change_site_domain.py
.
You can call the command as follows:
./manage.py wagtail_change_site_domain --site_id=1 --new_site_domain=yellowduck.be:443
The implementation is like this:
<app>/management/commands/wagtail_change_site_domain.py
from django.core.management.base import BaseCommand from wagtail.core.models import Site class Command(BaseCommand): """ Change site domain and port for wagtail. Example: ./manage.py wagtail_change_site_domain --site_id=2 --new_site_domain=yellowduck.be:443 """ def add_arguments(self, parser): parser.add_argument("--site_id", type=int, default=1) parser.add_argument("--new_site_domain", required=True) def handle(self, *args, **options): site_id = options["site_id"] new_site_domain = options["new_site_domain"] domain = new_site_domain port = 80 if ":" in new_site_domain: domain, port = new_site_domain.split(":") try: site = Site.objects.get(pk=site_id) site.hostname = domain site.port = port site.save() self.stdout.write(f"Domain changed to {new_site_domain}") except Site.DoesNotExist: self.stderr.write(f"No site with id {site_id}"")
The add_arguments
allows us to easily define the required and options arguments for the command. We define 2 of them: --site_id
and --new_site_domain
.
The handle
function is called when you run the command.
We start with parsing the command-line arguments. For the port
and domain
, we check if it's specified in the argument new_site_domain
and use that if specified. We wrap this in a try/catch
to properly handle an invalid --site_id
value.
We then lookup the site by it's ID using the Site
model, set the hostname
and port
and save it.