您可以使用模块安装后立即执行的post_init_hook 来检查purchase(purchase.order 在注册表中)模块是否已安装并添加自定义字段。您甚至可以使用转换和导入 XML 文件的convert_xml_import 函数通过继承加载 XML 文件以添加自定义字段。
类似于手动将字段添加到相应的模型和视图中。
当您卸载模块时,自定义字段不会被删除,为此您需要使用uninstall_hook,由于以下用户错误,您还需要手动删除视图:
用户错误
无法重命名/删除仍存在于视图中的字段
字段:purchase.order.x_reference
查看:purchase.order.form
首先在__manifest__.py文件中设置post_init_hook、uninstall_hook函数:
'post_init_hook': '_module_post_init',
'uninstall_hook': '_module_uninstall_hook',
然后在__init__.py 文件中定义这些函数:
import os
from odoo import fields, api, SUPERUSER_ID, tools, modules
from odoo.tools.misc import file_open
def _module_uninstall_hook(cr, registry):
if 'purchase.order' in registry:
env = api.Environment(cr, SUPERUSER_ID, {})
env.ref('stackoverflow_14.purchase_order_form').unlink()
env['ir.model.fields'].search([('name', '=', 'x_reference')]).unlink()
def _module_post_init(cr, registry):
if 'purchase.order' in registry:
env = api.Environment(cr, SUPERUSER_ID, {})
mp = env['ir.model'].search([('model', '=', 'purchase.order')], limit=1)
mp.write({'field_id': [(0, 0, {
'name': 'x_reference',
'field_description': "Reference",
'ttype': 'char',
})]})
pathname = os.path.join(modules.get_module_path('stackoverflow_14'), 'views', 'purchase_order.xml')
with file_open(pathname, 'rb') as fp:
tools.convert.convert_xml_import(cr, 'stackoverflow_14', fp)
views 内部定义的purchase_order.xml 文件使用视图继承将自定义字段添加到purchase_order_form 表单视图:
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<data>
<record id="purchase_order_form" model="ir.ui.view">
<field name="name">purchase.order.form</field>
<field name="model">purchase.order</field>
<field name="inherit_id" ref="purchase.purchase_order_form"/>
<field name="arch" type="xml">
<field name="partner_ref" position="after">
<field name="x_reference"/>
</field>
</field>
</record>
</data>
</odoo>