Odoo 12中Many2many字段创建编辑行为自定义方案咨询
好问题!在Odoo 12里,Many2many字段完全可以实现类似One2many那种在当前表单内编辑关联记录的效果,不用弹出默认的模型表单视图,下面给你详细拆解实现方法和备选方案:
实现方法:自定义内嵌编辑视图
1. 为关联模型创建专属内嵌表单视图
首先,你需要给Many2many关联的目标模型,创建一个简化/自定义的内嵌表单视图。这个视图只保留你需要的字段,并且设置editable属性,方便在当前页面编辑。
举个例子,假设你的Many2many字段关联的是res.partner模型,我们创建一个内嵌视图:
<record id="view_res_partner_embedded_form" model="ir.ui.view"> <field name="name">res.partner.embedded.form</field> <field name="model">res.partner</field> <field name="arch" type="xml"> <form string="内嵌合作伙伴表单" editable="bottom"> <group> <field name="name"/> <field name="email"/> <field name="phone"/> <!-- 这里只保留你需要展示和编辑的字段 --> </group> </form> </field> </record>
2. 在主表单的Many2many字段中指定该视图
接下来,回到你的主模型表单视图,修改Many2many字段的定义:使用widget="many2many_list"(这个widget支持内嵌编辑),设置editable属性控制新增记录的位置(top或bottom),同时通过context参数指定刚才创建的自定义视图。
示例代码:
<field name="partner_ids" widget="many2many_list" editable="bottom" context="{'form_view_ref': 'your_module.view_res_partner_embedded_form'}"/>
这样设置后,点击Many2many列表的「添加一条记录」按钮,就会在当前表单的下方(对应你截图里的绿色高亮区域)直接加载你自定义的内嵌表单,完全替代默认的弹出窗口效果。
注意事项
- 确保自定义视图的
model属性和Many2many关联的模型完全一致 - 如果只是想复用现有视图,直接把
form_view_ref的值改成现有视图的XML ID即可(比如base.view_partner_form),但建议自定义简化视图提升用户体验 - 修改后记得升级模块,确保视图正确加载
替代方案(特殊场景下的备选)
如果上述方法因为复杂交互需求无法满足,你可以试试这些方案:
- 自定义按钮触发内嵌视图:在主表单添加按钮,通过Odoo的前端API(比如
do_action)在当前页面加载关联模型的自定义视图,避免弹出窗口 - 用One2many模拟Many2many:创建一个中间关联模型,把原Many2many拆分为两个One2many字段(主模型到中间模型、中间模型到目标模型),这样就能完全复用One2many的内嵌编辑能力,但这会涉及数据库结构改动,需要谨慎评估
- 自定义Widget:如果需要高度定制的交互,还可以开发专属的Many2many Widget,通过JavaScript控制视图的渲染和行为
内容的提问来源于stack exchange,提问作者sss
相关产品推荐
相关产品推荐

