Odoo版本升级:Odoo17代码变更
Python代码
弃用name_get
在之前的Odoo版本中模型的display_name
字段与name_get
方法具有类似的用处,两者同时存在容易引起开发者的混淆。
Odoo16中为display_name
字段赋值
@api.depends(lambda self: (self._rec_name,) if self._rec_name else ())
def _compute_display_name(self):
names = dict(self.name_get())
for record in self:
record.display_name = names.get(record.id)
之前的版本中通过复写name_get
方法来改变display_name
字段的值(Odoo14中推荐的写法),在Odoo17中由于name_get
方法弃用,需要复写_compute_display_name
方法。
res.partner
模型中使用complete_name
字段来实现display_name
字段的功能
# Odoo16 res.partner
display_name = fields.Char(compute='_compute_display_name', recursive=True, store=True, index=True)
# Odoo17 res.partner的display_name字段的计算依赖于context中的属性,作为存储字段是没有意义的
complete_name = fields.Char(compute='_compute_complete_name', store=True, index=True)
@api.depends('complete_name', ...)
@api.depends_context('show_address', 'partner_show_db_id', ...)
def _compute_display_name(self):
...
模块钩子参数改变
模块钩子pre_init_hook, post_init_hook、 uninstall_hook
接收的参数从cr, registry
变为env
# Odoo16写法
def post_init_hook(cr, registry):
...
# Odoo17写法
def post_init_hook(env):
...
弃用get_resource_path与get_module_resource
使用file_path
方法来替代get_resource_path
,使用file_open
来替代open
。两个新方法都增加了安全检查,保证操作的文件位于addons_path
目录下。
with file_open(manifest_path, 'rb', env=self.env) as f:
terp.update(ast.literal_eval(f.read().decode()))
XML代码
规范context
中active_*
属性的用法
active_*
属性在Odoo18中将会被移除(参考),在Odoo17中仍然支持这些属性,但是会得到一个警告。现在需要使用替代方法来实现之前active_*
的功能,为之后的版本更新做好准备。
使用id
来替代active_id
使用硬编码来替换active_model
active_ids
并没有合适的方案,尽量使用其他的方式来达到你的需求
不再使用attrs
与states
属性
在之前的版本中,如果需要对一个字段进行隐藏,有多种方式可以实现:
<field name="total" attrs="{'invisible': [('name', '=', 'red')]}"/>
<field name="total" invisible="True"/>
<field name="total" invisible="1"/>
<field name="total" invisible="not context.get('show_me')"/>
在Odoo17中对这些写法进行了简化
<field name="field_a" readonly="not context.get('show_a')" attrs="{'readonly': [('field_b', '!=', False), ('field_c', '=', parent.c)]}"/>
<field name="field_b" states="draft"/>
在Odoo17中替换为下列写法
<field name="field_a" readonly="not context.get('show_a') or field_b and field_c == parent.c"/>
<field name="field_b" invisible="state != 'draft'"/>
继承写法的变化
<field name="field_a" readonly="not context.get('show_a')" attrs="{'invisible': [('field_b', '!=', False)]}"/>
<field name="field_a" position="attributes">
<attribute name="attrs">{'readonly': [('field_c', '=', False)], 'invisible': [('field_d', '!=', '3')]}</attribute>
</field>
Odoo17使用这种写法
<field name="field_a" readonly="not context.get('show_a')" invisible="field_b"/>
<field name="field_a" position="attributes">
<!-- 与表达式not context.get('show_a') 做或运算-->
<attribute name="readonly" add="(not field_c)" separator=" or "/>
<attribute name="invisible">field_d != 3</attribute>
</field>
tree
视图invisible
属性的变化
Odoo17中tree
视图的字段如果使用invisible="1"
属性来修饰,会显示表头,但是字段的值都是空。如果要完全隐藏一列,使用column_invisible="1"
属性。
OWL模板移除owl="1"
属性
转载自:https://juejin.cn/post/7308434338941026342