Wigtail:我可以使用API​​获取页面的只读草稿以供审核吗?

时间:2017-11-29 10:53:20

标签: django wagtail

标题几乎总结了这个问题,早期的文档讨论了/修订端点,但我无法找到它是否曾经实现过。

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

2 个答案:

答案 0 :(得分:6)

API旨在仅提供页面的实时版本,以避免泄露非公开的信息。但是,您可以通过继承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端点时,请使用此类代替PagesAPIEndpoint

api_router.register_endpoint('pages', DraftPagesAPIEndpoint)

这样您就可以在网址中传递?draft=true以获取草稿版本。

答案 1 :(得分:0)

我尝试实现@gasman所说的in his answer以及Bufke所说的in the comment,但是我无法实现。尝试序列化实例时,尽管实例已经存在,但我始终没有发现Page错误。

进一步的检查表明,我还需要重写get_queryset的{​​{1}}方法,因为它会排除非活动页面,从而使序列化程序抛出404。

因此,最终的更改将如下所示:

PagesAPIEndopint

,然后在注册端点时使用:

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) 一起使用。