在某些情况下,需要动态添加字段A,B,C…,以及动态添加到tree视图显示,因其后面是后面添加的字段故要用xpath来写
- 第一步给模型添加字段
例:给 account.move.line 模型动态添加字段
model = self.env['ir.model'].search([('model', '=', 'account.move.line')], limit=1) #找到记录account.move.line模型的记录
fields_name = 'x_wg_%s_id' % (res.model_id.model.replace('.', '_')) #字段name
new_field = self.env['ir.model.fields'].create({
'model_id': model.id, #添加到model模型的字段
'name': fields_name, #字段name
'field_description': res.name, #字段string
'ttype': 'many2one', #字段关系(任意都是可以的)
'relation': res.model_id.model, #many2one关联的模型(根据ttype来确认是否关联)
})
- 把字段添加在视图
例:往account.move.line的pivot视图添加字段
fields_arch = '<field name="{}" type="col"/>'.format(fields_name) #拼接xml字段格式
arch = u"""<xpath expr="//field[@name='product_id']" position="after">{}</xpath>""".format(fields_arch) #拼接xpath格式
self.env['ir.ui.view'].create({
'model': 'account.move.line', #往哪个模型添加
'inherit_id': self.env.ref("weigan_general_ledger.wg_move_line_report_pivot").id, #继承到哪个视图(模块.视图id)
'mode': 'primary', #模式
'arch': arch, #具体操作引进来
})
这样就完全可以实现动态添加字段以及把字段动态添加在某个视图(任意视图都可)
完整代码如下:
@api.model
def create(self, vals):
res = super(AccountAnalyticDimension, self).create(vals)
model = self.env['ir.model'].search([('model', '=', 'account.move.line')], limit=1)
fields_name = 'x_wg_%s_id' % (res.model_id.model.replace('.', '_'))
new_field = self.env['ir.model.fields'].create({
'model_id': model.id,
'name': fields_name,
'field_description': res.name,
'ttype': 'many2one',
'relation': res.model_id.model,
})
fields_arch = '<field name="{}" type="col"/>'.format(fields_name)
arch = u"""<xpath expr="//field[@name='product_id']" position="after">{}</xpath>""".format(fields_arch)
self.env['ir.ui.view'].create({
'model': 'account.move.line',
'inherit_id': self.env.ref("weigan_general_ledger.wg_move_line_report_pivot").id,
'mode': 'primary',
'arch': arch,
})
return res
上面的完整代码的例子说明:
在创建这个类(AccountAnalyticDimension)数据完成时,会根据里面数据来动态创建字段,然后把字段添加到pivot视图,即创建一条数据动态添加一个字段然后自动加到视图上。
当然,也可以完全创建新的视图,即动态创建完全新的视图
请查阅之前写的文章