Как проверить, что каждая страница wagtail будет иметь уникальный slug?
У меня есть несколько моделей, которые наследуются от Page, и я хотел бы проверить, что каждая добавляемая/редактируемая страница имеет уникальный slug. Также я хотел бы избежать переопределения метода save и выполнять проверку там для каждой страницы. Есть ли другой способ проверки уникальности slug при создании/редактировании страниц?
Отвечаю на свой вопрос на случай, если кто-то столкнется с той же проблемой:
Прочитав документацию wagtail hooks, можно зарегистрировать before_create_page и before_edit_page hooks и выполнять проверку уникальности slug там.
Одним из возможных решений может быть:
в wagtail_hooks.py
from wagtail.core import hooks
from wagtail.core.models import Page
from django.core.exceptions import ValidationError
...
...
@hooks.register("before_edit_page")
def before_edit_page(request, page):
validate_unique_slug(request, page)
@hooks.register("before_create_page")
def before_create_page(request, parent_page, page_class):
validate_unique_slug(request)
def validate_unique_slug(request, current_page=None):
req_slug = request.POST.get("slug")
if req_slug == None:
return
try:
db_page = Page.objects.get(slug=req_slug)
except Page.DoesNotExist:
return
if current_page == None or db_page.id != current_page.id:
raise ValidationError(
f"The slug {req_slug} is already in use, please choose another one"
)