Wagtail supports multiple sites with different domains using site specific root pages and settings. Snippets exist globally and this is how to make them site specific.The goal is to have a filtered list of snippets based on the currently active site.
Add site field to the snippet model, in order to assign a snippet to a site.
class FAQ(ClusterableModel):
site = models.ForeignKey(
Site,
on_delete=models.CASCADE,
related_name="+",
null=True,
blank=True,
help_text="Is this snippet specific to the current site?",
)
# other fields
panels = [
FieldPanel("site"),
# other field panels
]
In order to filter the list of snippets, create a SnippetViewSet.
class SiteSnippetViewSet(SnippetViewSet):
"""Snippet viewset that is scoped for the current site.
Note that the snippet needs to have a site field."""
base_model: type[models.Model]
icon = "snippet"
def get_queryset(self, request):
qs: models.QuerySet[models.Model] | None = super().get_queryset(request)
if qs is None:
qs = self.base_model.objects.all()
current_site = Site.find_for_request(request)
return qs.filter(models.Q(site=current_site) | models.Q(site=None))
Register the FAQ snippet using a custom view set that inherits from the SiteSnippetViewSet.
class FAQ(ClusterableModel):
site = models.ForeignKey(
Site,
on_delete=models.CASCADE,
related_name="+",
null=True,
blank=True,
help_text="Is this snippet specific to the current site?",
)
# other fields
panels = [
FieldPanel("site"),
# other field panels
]
class FAQViewSet(SiteSnippetViewSet):
base_model = FAQ
register_snippet(FAQ, viewset=FAQViewSet)
Navigate to your snippets, assign them to the correct site and change the domain. You will only see the snippets that are assigned to the current site!
Erben Systems GmbH
Watterstrasse 81, c/o Sarbach Treuhand AG, 8105 Regensdorf, Switzerland
CHE-174.268.027 MwSt