ODOO:后端弹出向导框

1、前端按钮,启动动作

2、后端动作,跳转向导框,并且将想要的值进行传递

3、向导后端接受传递的值,进行字段赋值,弹出向导框

ps:图中马赛克部分不重要,关键是从view_id开始,view_id得到的是向导框的id,context是需要传的值

 

res.update是接收传参然后给向导框赋值

 

### Odoo 17 后端程序化调用按钮动作 在 Odoo 17 中,可以通过编程方式触发前端按钮对应的动作。这通常涉及模拟用户的交互行为并调用相应的后端逻辑。以下是实现这一功能的关键点: #### 调用对象类型的按钮 对于 `type="object"` 的按钮,其背后的行为是由模型中的 Python 方法定义的。这些方法可以直接通过 RPC 或者内部服务调用来执行。例如,假设有一个名为 `my_button_method` 的方法绑定到某个按钮上,则可以在后台代码中这样调用它: ```python record = self.env['your.model'].browse(record_id) result = record.my_button_method() ``` 这里需要注意的是,上述代码片段假定已经获取到了目标记录实例,并且该记录支持所指定的方法调用[^1]。 #### 调用动作类型的按钮 针对 `type="action"` 类型的按钮,它们主要依赖于预设好的服务器动作 (Server Actions) 来完成特定的任务。这类按钮不会直接关联至某段具体的业务逻辑代码,而是指向一个已注册的动作 ID。为了模仿点击此类按钮的效果,在后端可以采用如下策略来激活相应动作: ```python from odoo import api, models class YourModel(models.Model): _inherit = 'your.model' def trigger_action(self, action_ref): IrActionsActWindowClose = self.env["ir.actions.act_window_close"] # 获取具体动作ID action_id = self.env.ref(action_ref).id # 执行动作 result = self.with_context(active_ids=self.ids).do_action(action_id) return result ``` 在这个例子当中,`trigger_action` 函数接收一个外部传入的动作引用字符串作为参数,比如 `'module_name.action_unique_identifier'` ,进而找到确切的动作编号并通过上下文中设置活动记录集的方式去启动这个动作[^2][^3]。 值得注意的地方在于,无论是哪种类型的按钮处理流程都需要确保权限控制得当以及数据一致性验证无误之后再实际应用以上提及的技术手段。 #### 综合示例:统一接口封装 考虑到不同场景下可能存在多种多样的需求变化情况,因此建议构建一套通用化的解决方案以便灵活应对各种情形下的按钮事件触发请求。下面给出这样一个综合性的实现方案供参考: ```python def invoke_button_logic(self, model_name, res_id=None, method_or_action='method', ref_str=''): """ Programmatic invocation of button logic. :param str model_name: Name of the target model. :param int|list[int]|None res_id: Resource id(s), can be single or multiple records. :param str method_or_action: Specify whether it's a method ('method') call or an action ('action'). :param str ref_str: Reference string used when invoking actions e.g., module.xml_id_of_the_action . """ ModelObj = self.env[model_name] if isinstance(res_id, list): recs = ModelObj.browse(res_id) elif res_id is not None: recs = ModelObj.browse([res_id]) else: raise ValueError("Resource identifier must either specify one resource or many.") if method_or_action == 'method': func_name = ref_str.split('.')[-1] getattr(recs, func_name)() elif method_or_action == 'action': act_id = self.env.ref(ref_str).id recs.do_action(act_id) else: raise NotImplementedError(f"'{method_or_action}' mode isn't supported.") ``` 此函数提供了一种简单易懂的方式来区分两种基本模式——基于方法名反射机制调用还是依据 XML-ID 查找对应的 Server Action 并加以施行。用户只需传递必要的参数即可轻松达成目的。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值