odoo-065 两个视图中的action类型的button互相引用,造成死循环
文章目录
- 问题
- 找问题
- 修改
- 总结
问题
在安装项目的新模块时,有个模块安装总是报错:找不到 xml id。
猜测:可能跟__manifest__.py 文件中的视图的顺序有关,加载按顺序加载的。
找问题
__manifest__.py 中的 顺序:
'data': [ 'views/customer_card.xml','views/sale_order_view.xml',],
调整顺序还是报找不到xml id的错,然后发现:
- 在 sale_order_view.xml 中引用
type="action"
的button,写法如下:
<button name="%(action_customer_card_order)d" type="action"><field name="year_card_count" widget="statinfo"/>
</button>
说明:这个 action_customer_card_order
是在 文件 customer_card.xml 中定义的。
- 在 customer_card.xml 中 中引用
type="action"
的button,写法如下:
<button name="%(action_sale_customer_year_card)d" type="action"><span>订单</span>
</button>
说明:这个 action_sale_customer_year_card
是在 文件 sale_order_view.xml 中定义的。
修改
如下修改,把 button 的 name
属性改成ref
,并且加上模块名称,可以正常安装。
1改后:
<button ref="qc_member_card.action_customer_card_order" type="action"><field name="year_card_count" widget="statinfo"/>
</button>
2改后:
<button ref="qc_member_card.action_sale_customer_year_card" type="action"><span>订单</span>
</button>
总结
这是典型的 Odoo XML ID 循环依赖问题。Odoo 加载 XML 文件的顺序由 manifest.py中的 data列表决定。
当两个视图文件互相引用对方的动作(action)时,无论哪个模块先加载,都会出现找不到 XML ID 的错误。
把 name 属性换成 ref,不清楚为什么这样就可以了,带研究。
其他方法:
或者把 action 的写法提取到一个公共文件,有限加载这个文件,可以避免循环引用的问题。