如何检测两个selection字段值并隐藏按钮?附Odoo代码尝试
Odoo视图继承:根据Selection字段值隐藏指定按钮
我最近在做Odoo销售订单模块的定制,需求是根据订单上两个selection字段的取值组合,把action_cancel按钮设置为不可见。目前已经写了部分视图继承代码,但还没完成,先把现有代码贴出来:
<?xml version="1.0" encoding="utf-8"?> <odoo> <record id="orchid_sale_order_cancel_request_inherit" model="ir.ui.view"> <field name="name">sale_order_cancel_request</field> <field name="model">sale.order</field> <field name="inherit_id" ref="sale.view_order_form"/> <field name="arch" type="xml"> <button name="action_cancel" position=...
其实这个需求的核心是利用Odoo视图的attrs属性做动态可见性控制,我整理了完整的实现代码和关键点:
完整实现代码
<?xml version="1.0" encoding="utf-8"?> <odoo> <record id="orchid_sale_order_cancel_request_inherit" model="ir.ui.view"> <field name="name">sale_order_cancel_request</field> <field name="model">sale.order</field> <field name="inherit_id" ref="sale.view_order_form"/> <field name="arch" type="xml"> <!-- 定位到action_cancel按钮,修改它的属性 --> <button name="action_cancel" position="attributes"> <!-- 这里替换成你实际的两个selection字段和目标值 --> <!-- 示例:当state为'confirmed'且自定义字段custom_cancel_status为'disallow'时隐藏按钮 --> <attribute name="attrs">{'invisible': [('state', '=', 'confirmed'), ('custom_cancel_status', '=', 'disallow')]}</attribute> </button> </field> </record> </odoo>
关键说明
- 用
position="attributes"来修改原有按钮的属性,这种方式不会破坏原视图的其他设置,比替换整个按钮更稳妥 attrs的invisible参数接受domain表达式,你可以灵活调整条件:- 多个条件同时满足:直接把条件并列在列表里,比如
[('field1', '=', 'val1'), ('field2', '=', 'val2')] - 满足任一条件:用
|来表示或关系,比如['|', ('field1', '=', 'val1'), ('field2', '=', 'val2')]
- 多个条件同时满足:直接把条件并列在列表里,比如
- 要确保你用到的两个selection字段确实属于
sale.order模型(包括你通过模型继承添加的自定义字段)
内容的提问来源于stack exchange,提问作者vbt




