Odoo中按钮name="%(window_action)d"机制及变体配置按钮解析
Odoo产品模板「配置变体」按钮工作机制及动作识别解析
一、按钮核心语法解析
你给出的按钮代码里,name="%(product_attribute_value_action)d"是Odoo特有的外部ID插值语法:
%(external_id):表示引用对应外部ID的系统记录,这里的product_attribute_value_action是目标ir.actions.act_window动作的外部ID(当前在product模块视图中,Odoo会自动补全模块前缀product,完整外部ID为product.product_attribute_value_action)。d:是整数格式符,Odoo加载视图时,会把该外部ID对应的动作记录的数据库ID替换到这个位置,最终按钮的name属性会变成该动作的数字ID。
二、Odoo识别外部ID的流程
- 模块加载阶段:Odoo会把所有模块中定义的外部ID(无论XML还是Python代码创建)与对应数据库记录建立映射,存在
ir_model_data表中。 - 视图渲染阶段:加载产品模板视图时,Odoo解析
%(external_id)d语法,通过ir_model_data表找到product.product_attribute_value_action对应的ir.actions.act_window记录,取出其ID替换到按钮的name属性里。 - 按钮触发阶段:点击按钮时,Odoo根据替换后的动作ID,匹配对应的窗口动作配置,打开产品属性变体配置界面。
三、找不到动作声明的原因
这个动作并非XML静态定义,而是Python代码动态创建的:
- 在
product模块中,它通常是模块安装/初始化时,通过env['ir.actions.act_window'].create()方法创建,或是在product.template模型的相关逻辑中动态关联生成。 - 你可以通过两种方式确认它的存在:
- 后台操作:进入「设置 > 技术 > 动作 > 窗口动作」,搜索
product_attribute_value_action,查看该动作的绑定模型、视图等详细配置。 - 数据库查询:执行SQL语句
SELECT id, name, res_model FROM ir_act_window WHERE ref = 'product.product_attribute_value_action';,直接从数据库获取该动作的记录信息。
- 后台操作:进入「设置 > 技术 > 动作 > 窗口动作」,搜索
四、按钮显示逻辑补充
按钮的attrs属性控制显示规则:
- 当产品模板的
attribute_line_ids(属性行)数量≤0,或是当前记录为产品变体(is_product_variant=True)时,按钮隐藏。 - 仅拥有
product.group_product_variant权限组的用户能看到该按钮。
内容的提问来源于stack exchange,提问作者Firman Azis Rauf
相关产品推荐
相关产品推荐

