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

如何有条件地为部分记录隐藏Odoo动作下拉框中的特定服务器动作

如何在Odoo中按条件隐藏特定服务器动作?

嘿,我明白你想实现的是根据分析请求(olims.analysis_request)记录的特定条件,把动作下拉框里的「Assign AR Number」服务器动作给隐藏掉对吧?我之前也处理过类似的需求,给你几个可行的方案:

方法1:使用binding_domain字段(Odoo 13及以上版本推荐)

Odoo 13之后给ir.actions.server添加了binding_domain字段,专门用来控制这个服务器动作在哪些记录上显示。你只需要在你的服务器动作定义里加上这个字段,填入对应的条件表达式就行。

比如,假设你只想在记录状态为draft的时候显示这个动作,修改后的代码如下:

<record id="ar_change_state_bulk_assign_id" model="ir.actions.server">
    <field name="name">Assign AR Number</field>
    <field name="type">ir.actions.server</field>
    <field name="model_id" ref="model_olims_analysis_request"/>
    <field name="state">code</field>
    <field name="code">self.bulk_assign_ar_number()</field> <!-- 替换成你实际的代码 -->
    <!-- 新增:设置动作显示的条件 -->
    <field name="binding_domain">[('state', '=', 'draft')]</field>
</record>

这样一来,只有满足binding_domain条件的记录,才会在动作下拉框里看到这个服务器动作。

方法2:通过ir.values记录控制(兼容旧版本Odoo)

如果你的Odoo版本低于13,没有binding_domain字段,可以通过创建ir.values记录来绑定动作并设置显示条件。这种方式是旧版本里控制动作可见性的标准做法:

<!-- 先定义你的服务器动作 -->
<record id="ar_change_state_bulk_assign_id" model="ir.actions.server">
    <field name="name">Assign AR Number</field>
    <field name="type">ir.actions.server</field>
    <field name="model_id" ref="model_olims_analysis_request"/>
    <field name="state">code</field>
    <field name="code">self.bulk_assign_ar_number()</field>
</record>

<!-- 再创建ir.values记录,绑定动作并设置显示条件 -->
<record id="action_assign_ar_number_values" model="ir.values">
    <field name="name">Assign AR Number</field>
    <field name="model_id" ref="model_olims_analysis_request"/>
    <field name="value" eval="'ir.actions.server,' + str(ref('ar_change_state_bulk_assign_id'))"/>
    <field name="key">action</field>
    <field name="key2">client_action_multi</field>
    <!-- 设置动作显示的条件,这里同样以state为draft为例 -->
    <field name="domain">[('state', '=', 'draft')]</field>
</record>

方法3:Python代码动态控制(复杂场景适用)

如果你的显示条件比较复杂,没法用简单的domain表达式表达(比如需要跨模型查询、多条件组合判断等),可以通过继承模型的方法来动态控制动作的可见性。

在olims.analysis_request模型的Python代码里添加以下逻辑:

from odoo import models, api

class AnalysisRequest(models.Model):
    _inherit = 'olims.analysis_request'

    @api.model
    def get_actions(self, action_ids=None):
        actions = super().get_actions(action_ids=action_ids)
        # 找到你要控制的服务器动作(替换成你的模块名)
        assign_action = self.env.ref('your_module_name.ar_change_state_bulk_assign_id')
        if assign_action in actions:
            # 根据你的自定义条件判断是否移除该动作
            # 这里示例:如果记录不是draft状态,就隐藏动作
            if not self.filtered(lambda r: r.state == 'draft'):
                actions.remove(assign_action)
        return actions

这种方式灵活性最高,能处理各种复杂的业务逻辑判断。

内容的提问来源于stack exchange,提问作者Muhammad Sajid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:06:50