如何根据条件实现向导按钮及成本价列表的动态显隐
Odoo 分仓库成本价字段与入口动态显隐实现方案
核心判定规则
两个条件同时满足时触发特殊显隐逻辑,其余场景完全保留系统原生字段、按钮展示规则:
- 系统配置项
res.config.settings.is_cost_price_per_warehouse值为True - 当前产品所属分类
product.category的成本核算方式property_cost_method值为average(平均成本)
触发后效果:隐藏product.template(产品模板)、product.product(产品变体)上的原生standard_price(标准成本)字段,展示「Cost Price List」跳转入口。
具体实现步骤
1. 扩展产品模型新增显隐判定计算字段
由于系统配置是全局参数、产品分类成本方法是关联字段,新增两个布尔型计算字段统一存储判定结果,避免视图层重复写判断逻辑。
先确保你在res.config.settings中定义的开关字段加了config_parameter属性,映射到全局参数表,示例:
# res.config.settings 扩展示例 class ResConfigSettings(models.TransientModel): _inherit = 'res.config.settings' is_cost_price_per_warehouse = fields.Boolean( string="按仓库维度核算成本价", config_parameter="custom_cost.is_cost_price_per_warehouse" )
之后扩展产品模板、产品变体模型,加计算字段和跳转方法:
from odoo import models, fields, api class ProductTemplate(models.Model): _inherit = 'product.template' hide_standard_price = fields.Boolean(compute="_compute_cost_visibility") show_cost_list_entry = fields.Boolean(compute="_compute_cost_visibility") @api.depends('categ_id.property_cost_method') def _compute_cost_visibility(self): # 读取全局开关配置 wh_cost_enabled = self.env['ir.config_parameter'].sudo().get_param( 'custom_cost.is_cost_price_per_warehouse', default=False ) for rec in self: trigger_status = wh_cost_enabled and rec.categ_id.property_cost_method == 'average' rec.hide_standard_price = trigger_status rec.show_cost_list_entry = trigger_status # 成本列表跳转方法 def action_open_warehouse_cost_list(self): self.ensure_one() return { 'type': 'ir.actions.act_window', 'name': 'Cost Price List', 'res_model': 'custom.warehouse.cost', # 替换为你自己的分仓库成本价模型 'view_mode': 'list,form', 'domain': [('product_tmpl_id', '=', self.id)], 'context': {'default_product_tmpl_id': self.id} } class ProductProduct(models.Model): _inherit = 'product.product' hide_standard_price = fields.Boolean(compute="_compute_cost_visibility") show_cost_list_entry = fields.Boolean(compute="_compute_cost_visibility") @api.depends('categ_id.property_cost_method') def _compute_cost_visibility(self): wh_cost_enabled = self.env['ir.config_parameter'].sudo().get_param( 'custom_cost.is_cost_price_per_warehouse', default=False ) for rec in self: trigger_status = wh_cost_enabled and rec.categ_id.property_cost_method == 'average' rec.hide_standard_price = trigger_status rec.show_cost_list_entry = trigger_status # 变体维度成本列表跳转方法 def action_open_warehouse_cost_list(self): self.ensure_one() return { 'type': 'ir.actions.act_window', 'name': 'Cost Price List', 'res_model': 'custom.warehouse.cost', 'view_mode': 'list,form', 'domain': [('product_id', '=', self.id)], 'context': {'default_product_id': self.id} }
2. 修改产品表单视图实现动态显隐
继承产品模板、产品变体的原生表单视图,给原生成本字段加动态隐藏属性,同时在对应位置插入成本列表跳转按钮:
<?xml version="1.0" encoding="utf-8"?> <odoo> <!-- 产品模板表单继承 --> <record id="tmpl_form_inherit_wh_cost" model="ir.ui.view"> <field name="name">product.template.form.wh.cost</field> <field name="model">product.template</field> <field name="inherit_id" ref="product.product_template_form_view"/> <field name="arch" type="xml"> <!-- 隐藏原生成本字段 --> <field name="standard_price" position="attributes"> <attribute name="attrs">{'invisible': [('hide_standard_price', '=', True)]}</attribute> </field> <!-- 插入成本列表入口按钮 --> <field name="standard_price" position="after"> <button name="action_open_warehouse_cost_list" type="object" string="Cost Price List" class="btn btn-link" attrs="{'invisible': [('show_cost_list_entry', '=', False)]}"/> </field> </field> </record> <!-- 产品变体表单继承 --> <record id="product_form_inherit_wh_cost" model="ir.ui.view"> <field name="name">product.product.form.wh.cost</field> <field name="model">product.product</field> <field name="inherit_id" ref="product.product_normal_form_view"/> <field name="arch" type="xml"> <field name="standard_price" position="attributes"> <attribute name="attrs">{'invisible': [('hide_standard_price', '=', True)]}</attribute> </field> <field name="standard_price" position="after"> <button name="action_open_warehouse_cost_list" type="object" string="Cost Price List" class="btn btn-link" attrs="{'invisible': [('show_cost_list_entry', '=', False)]}"/> </field> </field> </record> </odoo>
注意事项
- 全局配置字段不要漏加
config_parameter属性,否则无法通过参数表读取到开关值,会导致判定逻辑失效 - 计算字段的依赖只需要加
categ_id.property_cost_method即可,全局参数不属于模型字段,不需要加入依赖列表,修改全局配置后刷新页面即可重新计算显隐状态 - 如果已有其他自定义模块修改过
standard_price字段的attrs属性,需要调整本模块视图继承的优先级,确保属性规则正确合并,避免显隐逻辑冲突 - 如果需要在列表视图也实现相同显隐效果,直接复用两个计算字段,在列表视图中给对应字段、按钮加相同的
attrs规则即可
内容的提问来源于stack exchange,提问作者Jogi Manuke
相关产品推荐
相关产品推荐

