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

如何在表单视图遍历One2Many字段生成动态按钮?

Odoo表单视图中为One2Many字段每条记录生成自定义按钮的实现方法

可以通过Odoo的QWeb模板指令t-foreach实现这个需求,无需依赖树形组件,具体步骤如下:

1. 在表单视图中遍历One2Many字段生成按钮

先隐藏原有的One2Many树形字段,再用QWeb循环遍历字段的原始记录数据,为每条记录渲染按钮,同时直接获取子模型的字段值。

示例XML代码:

<field name="your_one2many_field" invisible="1"/> <!-- 隐藏默认树形组件 -->
<div class="oe_button_box" t-foreach="record.your_one2many_field.raw_value" t-as="line">
    <!-- 按钮文本显示子记录的name字段,点击触发自定义方法 -->
    <button type="object" 
            name="action_process_line" 
            string="操作: ${line.name}" 
            class="oe_highlight"
            context="{'line_id': line.id, 'line_code': line.code}"/>
</div>
  • record.your_one2many_field.raw_value:获取One2Many字段关联的所有子记录数组
  • ${line.name}:直接引用子模型的name字段值,渲染到按钮文本中
  • context:传递子记录ID和其他字段值到后端方法

2. 在模型中实现按钮处理方法

在当前表单对应的模型里,编写按钮触发的Python方法,通过上下文获取子记录数据并执行业务逻辑:

示例Python代码:

from odoo import models

class YourMainModel(models.Model):
    _inherit = 'your.main.model'

    def action_process_line(self):
        # 从上下文获取子记录ID和字段值
        line_id = self.env.context.get('line_id')
        line_code = self.env.context.get('line_code')
        
        # 根据ID获取子记录对象
        line_record = self.env['your.one2many.submodel'].browse(line_id)
        
        # 编写业务逻辑,比如发送通知或执行操作
        if line_record:
            self.env.user.notify_info(message=f"处理记录: {line_record.name} (编码: {line_code})")
        
        return True

注意事项

  • 确保One2Many关联的子模型有对应访问权限,避免数据获取时出现权限错误
  • raw_value是Odoo表单视图中获取关联记录原始数据的专属方式,仅在QWeb的t-foreach中有效
  • 按钮type可选object(调用模型方法)或action(触发动作),按需选择

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 07:35:27