Wagtail:我可以使用 API 来获取 read-only 页面草稿以供审阅吗?

Wagtail: Can i use the API for fetching read-only drafts of pages for review?

标题几乎概括了这个问题,早期的文档讨论了 /revision 端点,但我找不到它是否曾经实现过。

Wagtail 具有出色的编辑和保存页面的功能,我只需要预览草稿在我的应用程序使用时的外观。

API 旨在仅提供页面的实时版本,以避免泄露本不该 public 的信息。但是,您可以通过 subclassing PagesAPIEndpoint 覆盖此行为 - 例如:

from django.http import Http404
from rest_framework.response import Response
from wagtail.api.v2.endpoints import PagesAPIEndpoint


class DraftPagesAPIEndpoint(PagesAPIEndpoint):
    def detail_view(self, request, pk):
        instance = self.get_object()

        if request.GET.get('draft'):
            instance = instance.get_latest_revision_as_page()
        elif not instance.live:
            raise Http404

        serializer = self.get_serializer(instance)
        return Response(serializer.data)

然后,在注册 URL 端点时,使用此 class 代替 PagesAPIEndpoint:

api_router.register_endpoint('pages', DraftPagesAPIEndpoint)

这将使您能够在 URL 中通过 ?draft=true 以获得草稿版本。

我尝试实现 @gasman stated and also what Bufke mentioned 但无法实现。当我尝试序列化我的实例时,尽管该实例已经存在,但我总是遇到 Page not found 错误。

进一步检查表明我还需要重写 PagesAPIEndopintget_queryset 方法,因为它排除了不活动的页面,因此序列化程序抛出 404。

所以,最后的改动是这样的:

from django.http import Http404
from rest_framework.response import Response
from wagtail.api.v2.endpoints import PagesAPIEndpoint
from wagtail.api.v2.utils import (
    page_models_from_string,
    BadRequestError,
    filter_page_type,
)


class DraftPagesAPIEndpoint(PagesAPIEndpoint):
    def detail_view(self, request, pk):
        instance = self.get_object()

        if request.GET.get('draft'):
            instance = instance.get_latest_revision_as_page()
        elif not instance.live:
            raise Http404

        serializer = self.get_serializer(instance)
        return Response(serializer.data)

    def get_queryset(self):
        request = self.request

        # Allow pages to be filtered to a specific type
        try:
            models = page_models_from_string(request.GET.get('type', 'wagtailcore.Page'))
        except (LookupError, ValueError):
            raise BadRequestError("type doesn't exist")

        if not models:
            models = [Page]

        if len(models) == 1:
            queryset = models[0].objects.all()
        else:
            queryset = Page.objects.all()

            # Filter pages by specified models
            queryset = filter_page_type(queryset, models)

        # Filter by site
        if request.site:
            queryset = queryset.descendant_of(request.site.root_page, inclusive=True)
        else:
            # No sites configured
            queryset = queryset.none()

        return queryset

然后在注册端点时使用:

api_router.register_endpoint('pages', DraftPagesAPIEndpoint)

您现在可以在端点中使用草稿查询参数作为 ?draft=true