标题几乎总结了这个问题,早期的文档讨论了/修订端点,但我无法找到它是否曾经实现过。
Wagtail具有编辑和保存页面的出色功能,我只需要预览应用程序使用时草稿的外观。
答案 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)
一起使用。