You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为按钮调用的方法传参?树视图选中记录创建关联模型记录

Odoo Tree视图两种创建模型B记录的实现方案

一、选中行后点击顶部按钮创建模型B记录

1. 视图配置

在模型A的Tree视图中添加顶部操作按钮,绑定自定义方法:

<record id="model_a_tree_view" model="ir.ui.view">
    <field name="name">model.a.tree.view</field>
    <field name="model">model.a</field>
    <field name="arch" type="xml">
        <tree string="模型A列表">
            <!-- 顶部批量操作按钮 -->
            <buttons>
                <button name="action_create_model_b_batch" string="批量创建B记录" type="object" />
            </buttons>
            <!-- 原有列表字段 -->
            <field name="field1"/>
            <field name="field2"/>
        </tree>
    </field>
</record>

2. Python方法实现

在模型A的代码中编写方法,self即为选中的模型A记录集合,直接遍历或取值即可:

from odoo import models, fields, api

class ModelA(models.Model):
    _name = 'model.a'
    _description = '模型A'

    field1 = fields.Char('字段1')
    field2 = fields.Char('字段2')

    def action_create_model_b_batch(self):
        # 遍历所有选中记录,批量创建模型B记录
        for rec in self:
            self.env['model.b'].create({
                'field1': rec.field1,
                'field2': rec.field2,
                # 其他字段映射,根据实际需求补充
            })
        # 可选:返回动作刷新当前视图
        return {
            'type': 'ir.actions.act_window',
            'res_model': self._name,
            'view_mode': 'tree',
            'target': 'current',
        }

二、每行添加独立按钮创建模型B记录

1. 视图配置

在Tree视图的字段列表中添加按钮类型的字段,指定widget="button":

<record id="model_a_tree_view" model="ir.ui.view">
    <field name="name">model.a.tree.view</field>
    <field name="model">model.a</field>
    <field name="arch" type="xml">
        <tree string="模型A列表">
            <field name="field1"/>
            <field name="field2"/>
            <!-- 每行独立操作按钮 -->
            <field name="action_create_model_b_single" widget="button" string="创建B记录" type="object"/>
        </tree>
    </field>
</record>

2. Python方法实现

此时按钮触发时,self即为当前行对应的单条模型A记录,直接取值创建即可:

class ModelA(models.Model):
    _name = 'model.a'
    _description = '模型A'

    # ... 原有字段定义 ...

    def action_create_model_b_single(self):
        # self是当前行的单条模型A记录
        self.env['model.b'].create({
            'field1': self.field1,
            'field2': self.field2,
            # 其他字段映射
        })
        # 可选:返回动作刷新当前视图
        return {
            'type': 'ir.actions.act_window',
            'res_model': self._name,
            'view_mode': 'tree',
            'target': 'current',
        }

内容的提问来源于stack exchange,提问作者user1632812

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 06:05:12