修改 Wagtail 发布下拉列表(每个应用程序)

Modifying the Wagtail publish dropdown (per app)

我想重新配置默认 "Publish" 菜单。默认配置是这样的:

我想让发布成为默认操作,并将其移至顶部。我还想删除“提交审核”,因为我们的网站目前不需要该功能。

理想情况下,我希望能够在每个应用程序的基础上覆盖菜单配置 - 将来我们可能会在网站的其他部分设置不同的配置。

这可能吗?

恐怕目前不可能 - 菜单项已固定在 wagtailadmin/pages/create.html and edit.html

根据 ,从 Wagtail 2.4 开始,使用 register_page_action_menu_item 钩子是可能的。此外,Wagtail 2.7(在撰写本文时未发布)提供了一个 construct_page_listing_buttons 钩子来修改现有选项。

您可以通过在 wagtail 钩子的帮助下注册自定义菜单项来向操作菜单添加新项。 为此,请在您现有的任何 Django 应用程序中创建一个名为 wagtail_hooks.py 的文件。

from wagtail.core import hooks
from wagtail.admin.action_menu import ActionMenuItem

class GuacamoleMenuItem(ActionMenuItem):
    label = "Guacamole"

    def get_url(self, request, context):
        return "https://www.youtube.com/watch?v=dNJdJIwCF_Y"


@hooks.register('register_page_action_menu_item')
def register_guacamole_menu_item():
    return GuacamoleMenuItem(order=10)

Source

如果您想删除现有的菜单项:

@hooks.register('construct_page_action_menu')
def remove_submit_to_moderator_option(menu_items, request, context):
    menu_items[:] = [item for item in menu_items if item.name != 'action-submit']

默认按钮 SAVE DRAFT 仍然是硬编码的,因此无法轻松配置。参见 here

如果不进行一些猴子修补,似乎无法在服务器端完成。

但是,如果您自己想要它(或者可以访问那些将要发布的人的计算机),您可以改为修改您的浏览器。

  1. 安装Tampermonkey浏览器插件
  2. 使用以下内容创建新脚本
  3. http://127.0.0.1:8000/admin/* 更改为您的 wagtail 管理面板 url 模式
  4. 保存脚本并检查管理面板

结果应如下所示:


// ==UserScript==
// @name     Wagtail: replace "Save draft" with "Publish"
// @match    *://127.0.0.1:8000/admin/*
// @require  https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js
// ==/UserScript==


let $ = window.jQuery;


function modify() {
    let draft = $("button.button-longrunning:contains('Save draft')");
    let publish = $("button.button-longrunning:contains('Publish')");

    if (draft.length && publish.length) {
        swap(publish, draft);
    }
};


function swap(a, b) {
    a = $(a); b = $(b);
    var tmp = $('<span>').hide();
    a.before(tmp);
    b.before(a);
    tmp.replaceWith(b);
};


$(document).ready(function() {
    setTimeout(function() {
        try {
            modify();
        }
        catch (e) {
            console.error(e, e.stack);
        }
    }, 100);
});

修改上面的代码,这些选择器适用于所有管理语言:

let draft = $("button.button-longrunning.action-save");
let publish = $("button.button-longrunning[name='action-publish']");