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

66 篇文章 3 订阅
23 篇文章 0 订阅

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

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

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

隔壁小红馆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值