前言
最近在公司的oa系统开发中,我们想要实现集团的财务流程审批,审批流对于odoo来说是强项,所以本来以为这个地方是很好做的,但是我们老大要求,做一个基础模型包含一些常用的字段,然后所有的业务流程都继承这个基础模型。
如下图:
模型B继承了模型A,使用原型继承的方式
| | inherit | |
| A | ------------------> | B |
| | | |
最开始,我们的设想是在基础model类的视图xml里面,写入一个div,然后在继承的model里面继承这个模型,用把子类独有的field字段加到里面去(代码如下),这样做之后有一个问题,就是页面上会出现父类的所有的字段。
<field name="inherit_id" ref="base_oa.oa_my_process_flow_view_form"/>
<field name="arch" type="xml">
<xpath expr="//div[hasclass('process_more_info')]" position="replace">
<field name="pay_detail" />
<group class="oe_subtotal_footer oe_right" colspan="2" name="sale_total">
<!--<field name="total_amount"/>-->
<div class="oe_subtotal_footer_separator oe_inline o_td_label">
<label for="total_amount"/>
</div>
<span style="color:red">
<field name="total_amount" nolabel="1" class="oe_subtotal_footer_separator"/>
做到这里,我以为是odoo的框架限制,做不到这一点,所以也就没有深究了,但是第二天副总看到我找的替代方案(把一些button重复写在每一个子类里面),不是很满意。但是我找了方案还是没有找到,后来咨询了一个odoo开发者之后,他只是说了产品和产品变体可以实现,我没理解。
第三天,我们公司新来没几天的一个odoo人员解决了这个问题,具体实现方法如下:
在子类的view里面,添加一行primary,然后通过xpath来实现即可。
```xml
<field name="mode">primary</field>
<field name="inherit_id" ref="base_oa.my_process_flow_view_form"/>
<field name="arch" type="xml">
<xpath expr="//div[hasclass('process_more_info')]" position=“replace”>
<field name="pay_detail"/>
</xpath>
</field>
之所以这样可以,是因为odoo定义的view底层里面,有一个字段mode,可以通过设置mode字段来解决继承的问题,如果在子类里面把mode设置为primary,那么就可以将当前的类设置为主要的类,这个类里面的</xpath>就可以被设定了,可以把当前record里面的内容镶嵌到父类的record里面。


效果如下:
最上面的按钮和下面的“操作日志明细”,都是父类的,中间的视图是子类的,完美实现了我们想要的效果。
后记:
在新人提出这个方案解决了这个问题之后,我问他是怎么想到这个方案的,他说副总开会的时候提出这个问题,他突然又想到了以前好像看过这个点,从产品和产品变体那里找到了答案,当时我内心里面突然失落,之前的那个开发者听懂了我的问题,但是我却没有看懂的他的答案,缺失在odoo自带的产品和产品变体里面很多这样的例子。

product.template类

product.product的视图,不是同一个类依然可以通过inherit来实现视图的继承,所以可见多多研究odoo底层的重要性。戒骄戒躁,与大家共勉。
版权声明:本文为Mr_Gorgre原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。