Django Wagtail:我可以使用API获取页面的只读草稿以供审阅吗?

Django Wagtail:我可以使用API获取页面的只读草稿以供审阅吗?,django,wagtail,Django,Wagtail,这个标题很好地总结了这个问题,早期的文档讨论了a/revision端点,但我找不到它是否实现过 Wagtail具有出色的编辑和保存页面的功能,我只需要预览我的应用程序使用草稿时的外观。该API旨在仅为页面的实时版本提供服务,以避免泄漏不打算公开的信息。但是,您可以通过子类化PagesAPIEndpoint来覆盖此行为-例如: from django.http import Http404 from rest_framework.response import Response from wagt

这个标题很好地总结了这个问题,早期的文档讨论了a/revision端点,但我找不到它是否实现过


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

该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)
这将使您能够在URL中传递
?draft=true
,以获取草稿版本。

我试图实现Bufke所述的内容,但无法实现。当我试图序列化我的实例时,我总是发现一个错误,尽管实例已经存在

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

因此,最终的变化如下:

从django.http导入Http404
来自rest\u framework.response导入响应
从wagtail.api.v2.endpoints导入PagesAPIEndpoint
从wagtail.api.v2.utils导入(
页面\u模型\u来自\u字符串,
错误,
过滤器\页面\类型,
)
类DraftPagesAPIEndpoint(PagesAPIEndpoint):
def详细信息视图(自我、请求、主键):
instance=self.get\u对象()
if request.GET.GET('draft'):
instance=instance.get\u最新版本\u作为\u页面()
elif not instance.live:
提高Http404
serializer=self.get\u序列化程序(实例)
返回响应(serializer.data)
def get_queryset(自我):
请求=自我请求
#允许将页面筛选为特定类型
尝试:
models=page\u models\u from\u string(request.GET.GET('type','wagtailcore.page'))
除了(LookupError、ValueError):
引发BadRequestError(“类型不存在”)
如果不是模型:
型号=[第页]
如果len(型号)==1:
queryset=models[0]。objects.all()
其他:
queryset=Page.objects.all()
#按指定模型筛选页面
queryset=过滤器\页面\类型(queryset,型号)
#按站点筛选
如有要求,请访问网站:
queryset=queryset.SUNDANT_of(request.site.root_页面,包括=True)
其他:
#没有配置站点
queryset=queryset.none()
返回查询集
然后在注册端点时使用:

api_router.register_endpoint('pages', DraftPagesAPIEndpoint)

现在,您可以在端点中将其与草稿查询参数一起使用,如
?draft=true

我在我的项目中添加了此解算的一个变体。如果有人想让这个更好,甚至想让它顺流而下,打开并发表,让我们谈谈。@Bufke我正在看你的代码。我了解了计算散列然后将其提供给API以显示信息的大部分内容,但是,我不明白如何覆盖
预览
按钮的URL以指向SPA。我还查看了edit.html上的
\u preview\u button\u,但没有完全理解。你能在这里给我一个指针吗?@SanyamKhurana它在摇摆尾巴中凌驾于上方。它获取页面url并插入哈希作为查询参数。