Snippets tip voor met wagtail-localize

Snippets Wagtail en Wagtail localize, een gotcha

wagtail-banner-image

Stel je hebt een pagina met gerelateerde tags die via snippets zijn toegevoegd, en je wilt alle pagina’s opvragen met een specifieke tag.

Wanneer synchronisatievertaling is ingeschakeld, verwijst de tag naar de standaardtaal. Maar als de gebruiker synchronisatievertaling uitschakelt, verwijst de tag naar de taal van de pagina. Dit kan betekenen dat de gebruiker een vertaalde tag verwijst binnen de vertaalde pagina, waardoor de query sommige pagina’s met de oorspronkelijke tag mist.

Om dit op te lossen, kun je zowel de standaardtaal als de huidige taal opvragen en vervolgens filteren op basis van de actieve taal.

from django.db import models
from django.db.models import Q
from django.utils.translation import gettext_lazy as _ 
from wagtail.snippets.models import register_snippet
from wagtail.models import TranslatableMixin, Page


@register_snippet
class Tag(TranslatableMixin, models.Model):
    tag = models.CharField(_("Tag"), max_length=255)

    def __str__(self):
        return self.tag

class BlogPage(Page):
    my_tag = models.ForeignKey(
        "snippets.Tag",
        null=True,
        blank=True,
        on_delete=models.SET_NULL,
        related_name="+",
    )

    def get_context(self, request, *args, **kwargs):
        context = super().get_context(request, *args, **kwargs)
        if self.my_tag:
            default_tag = self.my_tag.get_translation(self.my_tag.get_default_locale())
            context['pages'] = BlogPage.objects.live().filter(Q(locale=self.locale), Q(my_tag=default_tag) | Q(my_tag=self.my_tag)).distinct()
            return context