Odoo 8中根据sales_divisi_id控制按钮隐藏失效求助
Odoo 8按钮隐藏配置失效问题排查与解决
问题场景
在Odoo 8中需实现当sales_divisi_id为VET时隐藏「Approve Checker」按钮,但当前配置未生效,以下是现有代码:
现有代码
Python计算字段方法
@api.depends('product_id') def get_sales_divisi(self): for line in self: if line.product_id.divisi_update: line.sales_divisi_id = line.product_id.divisi_update.id elif line.product_id.divisi_ids: line.sales_divisi_id = line.product_id.divisi_ids.ids[0]
XML按钮配置
<button name="action_approve" string="Approve Checker" type="object" attrs="{'invisible':['|',('sales_divisi_id', '=', '2'),('sales_divisi_id', 'in', ('VET'))]}" groups="ts_addons_tbk.group_tbk_checker" />
解决建议
1. 字段匹配逻辑错误
sales_divisi_id是many2one字段,存储的是关联记录的ID,而非字符串名称:
- 直接用
VET匹配完全无效,要么用对应记录的ID(比如你写的2),要么通过字段的name属性匹配:
<!-- 按名称匹配的正确写法 --> attrs="{'invisible':['|',('sales_divisi_id', '=', 2),('sales_divisi_id.name', '=', 'VET')]}"
2. 计算字段触发机制问题
Odoo 8中@api.depends的触发条件需精准:
- 确保
sales_divisi_id正确定义为计算字段,若需缓存值要加store=True:
sales_divisi_id = fields.Many2one('your.divisi.model', compute='get_sales_divisi', store=True)
- 若
divisi_update或divisi_ids是关联字段,需把依赖条件细化到子字段,避免计算逻辑不触发:
@api.depends('product_id.divisi_update', 'product_id.divisi_ids')
3. 视图与权限校验
- 用开发者模式查看当前记录的
sales_divisi_id实际值,确认计算逻辑是否正确赋值; - 刷新视图缓存(开发者模式点击「刷新视图」),或重启Odoo服务,确保XML修改生效;
- 检查当前用户是否属于
ts_addons_tbk.group_tbk_checker组,组权限可能覆盖attrs的隐藏规则。
4. 逻辑运算符冗余
当前XML用|(或逻辑)表示「ID为2 或 名称为VET时隐藏」,如果仅需VET时隐藏,直接简化条件:
attrs="{'invisible':[('sales_divisi_id.name', '=', 'VET')]}"
内容的提问来源于stack exchange,提问作者Nur Faiz
相关产品推荐
相关产品推荐

