odoo 动态添加字段和视图动态添加字段

在某些情况下,需要动态添加字段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视图,即创建一条数据动态添加一个字段然后自动加到视图上。

当然,也可以完全创建新的视图,即动态创建完全新的视图
请查阅之前写的文章

猜你喜欢

转载自blog.csdn.net/weixin_42464956/article/details/109545171