如何在表单视图遍历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
相关产品推荐
相关产品推荐

