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 错误。
进一步检查表明我还需要重写 PagesAPIEndopint
的 get_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
。
标题几乎概括了这个问题,早期的文档讨论了 /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
进一步检查表明我还需要重写 PagesAPIEndopint
的 get_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
。