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:
1./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
1from django.core.management.base import BaseCommand
2
3from wagtail.core.models import Site
4
5class Command(BaseCommand):
6 """
7 Change site domain and port for wagtail.
8 Example:
9 ./manage.py wagtail_change_site_domain --site_id=2 --new_site_domain=yellowduck.be:443
10 """
11
12 def add_arguments(self, parser):
13 parser.add_argument("--site_id", type=int, default=1)
14 parser.add_argument("--new_site_domain", required=True)
15
16 def handle(self, *args, **options):
17
18 site_id = options["site_id"]
19 new_site_domain = options["new_site_domain"]
20
21 domain = new_site_domain
22 port = 80
23 if ":" in new_site_domain:
24 domain, port = new_site_domain.split(":")
25
26 try:
27 site = Site.objects.get(pk=site_id)
28 site.hostname = domain
29 site.port = port
30 site.save()
31
32 self.stdout.write(f"Domain changed to {new_site_domain}")
33 except Site.DoesNotExist:
34 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.
If this post was enjoyable or useful for you, please share it! If you have comments, questions, or feedback, you can email my personal email. To get new posts, subscribe use the RSS feed.