You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Frappe框架操作按钮路由被自动添加/app前缀问题求助

解决Frappe操作按钮跳转路由自动添加/app前缀的问题

问题根源

Frappe前端路由机制默认会为内部应用路由自动拼接/app前缀,若直接用frappe.set_route("ABC")或按钮action配置跳转/ABC,框架会将其判定为内部路由并加上/app前缀。而hooks中配置的重定向是服务器端生效的,仅当浏览器向服务器发起页面请求时触发,前端单页应用内的路由切换不会触发该重定向,因此只有刷新页面时才会生效。

解决方法

方法1:修改操作按钮跳转逻辑,直接跳转到目标路由

若/ABC是独立路由(非Frappe内部应用页面),可在按钮点击事件中使用原生JS跳转,绕过Frappe内部路由处理:

  • 若通过文档类型操作按钮配置设置action:
function() {
    window.location.href = "/ABC";
}
  • 若通过Python代码添加自定义按钮:
frappe.ui.form.on("自定义文档类型", {
    refresh: function(frm) {
        frm.add_custom_button("跳转至ABC", function() {
            window.location.href = "/ABC";
        });
    }
});

方法2:配置Frappe路由规则,排除/ABC的/app前缀

若/ABC是Frappe自定义页面,可在hooks.py中配置website_route_rules,让框架直接识别/ABC而不添加前缀:

website_route_rules = [
    {"from_route": "/ABC", "to_route": "path/to/your/page"},
]

此处path/to/your/page替换为实际页面模板路径或页面名称,配置后操作按钮可直接使用frappe.set_route("ABC"),框架不会再自动添加/app前缀。

方法3:前端路由拦截修正(兼容内部路由场景)

若必须通过Frappe内部路由跳转,可在自定义JS文件中添加路由拦截逻辑,在路由切换时自动修正路径:

frappe.router.on("route_change", function(route) {
    if (route[0] === "app" && route[1] === "ABC") {
        window.location.href = "/ABC";
    }
});

该方法会在路由切换到/app/ABC时自动跳转到/ABC,无需刷新页面。

注意事项

  • 确保/ABC对应的页面已正确配置,服务器端可正常访问该路径。
  • 开发模式下修改hooks或JS文件后,需重启Frappe服务并清空浏览器缓存,避免旧代码干扰。

内容的提问来源于stack exchange,提问作者Mehdi CHEBBAH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 17:32:45