← Home

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!

← Home

Erben Systems GmbH

Watterstrasse 81, c/o Sarbach Treuhand AG, 8105 Regensdorf, Switzerland

CHE-174.268.027 MwSt