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

如何根据条件实现向导按钮及成本价列表的动态显隐

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 20:36:19