【问题标题】:how to ajaxify the Wagtail-CMS page's actions?如何 ajaxify Wagtail-CMS 页面的操作?
【发布时间】:2025-12-02 05:35:01
【问题描述】:

我需要让管理员用户在按下任何一个(发布、取消发布、save_review ...等)时留在页面中,而不是重定向到任何其他页面或刷新编辑页面,而是只应用请求的更改并获得具有操作状态(成功或失败)的通知(消息)。

注意事项:

  1. 我不需要 JQ 代码示例,但需要后端 (pythonic-way) 功能来控制此类事件。
  2. 原因有很多,例如改善用户体验和降低服务器/网络成本......等等。

【问题讨论】:

  • 请编辑问题以将其限制为具有足够详细信息的特定问题,以确定适当的答案。

标签: wagtail


【解决方案1】:

您不需要“Ajaxify”行为来实现大部分目标,但是我了解您的目标。

当一个页面被保存(发布、取消发布甚至只是保存草稿)时,会向 Django 服务器发出 POST 请求,该服务器将保存到数据库,然后默认重定向到页面的父级。不幸的是,使用 ajax 样式请求来支持这一点需要相当多的工作。

但是,您可以使用 Wagail Hooks 系统修改重定向行为,这允许您为整个 Wagtail 代码的核心行为编写自定义逻辑。

首先-请阅读Wagtail Hooks的介绍和概述

示例

  • 创建一个钩子,让用户在发布时保持在编辑页面上(保存草稿、发布等)
  • 在您的 wagtail_hooks.py 文件中添加以下内容
from django.shortcuts import redirect
from django.urls import reverse

from wagtail.core import hooks


@hooks.register("after_edit_page")
def after_edit_page(request, page):

    if request.method == "POST":
        target_url = reverse("wagtailadmin_pages:edit", args=[page.id])
        return redirect(target_url)

  • 注意:您可以考虑不重定向,但您需要在“保存”按钮提交 POST 时返回响应。

【讨论】:

  • 如果这还不够,可能值得添加一个新问题或修改这个现有问题,以更好地传达您要解决的实际问题(即,您为什么不希望页面重新加载? )。
  • 原因有很多,一个是UX,一个是服务器负载,比如想象一下如果同时有1000个编辑器,每次保存刷新页面的成本要远高于只是一个http请求保存更改而无需再次下载整个页面,尤其是大部分内容都没有缓存
  • 听起来像是一些很棒的改进想法,尤其是缓存。如果您有时间,将这些想法分解并作为功能请求在 Wagtail 存储库中提出会很有帮助 - github.com/wagtail/wagtail/issues - 如果您有想法,建议对 UX 进行一些具体的改进也可能会很好。它可能不会立即发生,但至少在 GitHub 上可以讨论和跟踪它,也许有人会为改进做出贡献。希望对您有所帮助。