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

Odoo15安装自定义双表关联模块时触发ParseError报错

Odoo15 双关联表自定义模块安装报错排查

问题场景

  • 运行环境:Odoo15
  • 开发需求:开发支持两张关联表数据存储的表单结构
  • 故障表现:安装自定义模块时抛出解析错误,初步排查排除菜单项本身的语法问题,查阅官方文档未定位到根因

提交的相关代码

模型代码

from odoo import models, fields


class dga_doc(models.Model):
    _name = "dnre.dga_doc"
    _auto = False
    _description = "DNRE - Recursos Humanos"

    nc = fields.Integer(string="Nº contribuente", required=True)
    dc = fields.Char(string="Designação contribuente", required=True)
    ca = fields.Integer(string="CA")
    da = fields.Char(string="DA")
    mr = fields.Date(string="MR")
    tc = fields.Integer(string="TC")
    r = fields.Char(string="Regime")
    dga = fields.One2many('dnre.dga', 'dga_id', string="DGA Lines", readonly="True")

class dga(models.Model):
    _name = "dnre.dga"
    _description = "DGA Funcionarios"

    dga_id = fields.Many2one('dnre.dga_doc', string="dga", readonly="True")
    nums = fields.Integer(string="Nº segurado", required=True)
    ns = fields.Char(string="Nome segurado", required=True)
    cp = fields.Char(string="CP")
    pc = fields.Char(string="P/C")
    ndt = fields.Integer(string="Nº DT")
    sl = fields.Integer(string="SL")
    cs = fields.Char(string="CS")
    cf = fields.Integer(string="CF")
    cep = fields.Integer(string="CEP")

视图代码

<odoo>
  <data>
    <!-- Top menu item -->
    <menuitem name="DNRE" id="dnre.menu_root"/>

    <!-- menu categories -->
    <menuitem name="FOS" id="dnre.menu_1" parent="dnre.menu_root"/>

    <!-- actions -->
    <menuitem name="DGA" id="dnre.menu_1_list" parent="dnre.menu_1" action="dnre.action_dga"/>
    <menuitem name="DGCI" id="dnre.menu_2_list" parent="dnre.menu_1" action="dnre.action_dgci"/>

    <!-- actions opening views on models -->
    <record model="ir.actions.act_window" id="dnre.action_dga">
      <field name="name">Folha de Orçamento Salarial</field>
      <field name="res_model">dnre.dgci_doc</field>
      <field name="view_mode">tree, form</field>
    </record>

    <record model="ir.actions.act_window" id="dnre.action_dgci">
      <field name="name">Folha de Orçamento Salarial</field>
      <field name="res_model">dnre.dga_doc</field>
      <field name="view_mode">tree, form</field>
    </record>

    <!-- server action to the one above -->
    <record model="ir.actions.server" id="dnre.action_server">
      <field name="name">dnre server</field>
      <field name="model_id" ref="model_dnre_dga_doc"/>
      <field name="state">code</field>
      <field name="code">
        action = {
          "type": "ir.actions.act_window",
          "view_mode": "tree, form",
          "res_model": model._name,
        }
      </field>
    </record>

    <record model="ir.ui.view" id="dnre.list_dga">
      <field name="name">dnre dga list</field>
      <field name="model">dnre.dga_doc</field>
      <field name="arch" type="xml">
        <form>
          <group string="Informação do documento">
            <group colspan="4" col="6">
              <field name="nc"/>
              <field name="dc"/>
              <field name="ca"/>
              <field name="da"/>
              <field name="mr"/>
              <field name="tc"/>
              <field name="r"/>
            </group>
          </group>
          <notebook>
            <page string="Funcionários DGA">
              <field name="dga">
                <tree>
                  <field name="nums"/>
                  <field name="ns"/>
                  <field name="cp"/>
                  <field name="pc"/>
                  <field name="ndt"/>
                  <field name="sl"/>
                  <field name="cs"/>
                  <field name="cf"/>
                  <field name="cep"/>
                </tree>
              </field>
            </page>
          </notebook>
        </form>
      </field>
    </record>
  </data>
</odoo>

报错信息

Traceback (most recent call last):
  File "/home/ruben/Documents/MyLab/DNRE/odoo/odoo/http.py", line 694, in _handle_exception
    return super()._handle_exception(exception)
  File "/home/ruben/Documents/MyLab/DNRE/odoo/odoo/http.py", line 324, in _handle_exception
    raise exception.with_traceback(None) from new_cause
odoo.tools.convert.ParseError: while parsing /home/ruben/Documents/MyLab/DNRE/dnre-addons/dnre/views/dga.xml:10, somewhere inside
<menuitem name="DGA" id="dnre.menu_1_list" parent="dnre.menu_1" action="dnre.action_dga"/>

根因及修复方案

报错指向菜单项只是解析失败的触发点,实际问题出在多处代码逻辑错误:

  1. 主模型错误配置_auto = False
    该参数作用是告知Odoo不要自动为模型创建数据库数据表,仅用于基于SQL查询的只读虚拟模型。你当前开发的是需要持久化存储业务数据的普通模型,直接删除_auto = False这行配置即可。
  2. 窗口动作绑定模型错误,且引用不存在的模型
    两个窗口动作的res_model完全写反,且dnre.action_dga绑定的dnre.dgci_doc模型在代码中没有定义:
    • DGA菜单对应的dnre.action_dga动作,res_model应改为dnre.dga_doc
    • 若暂未开发DGCI对应的模型,先删除DGCI相关的菜单项、动作定义,避免引用不存在的模型报错
  3. XML记录加载顺序错误
    Odoo解析XML文件按从上到下顺序执行,你当前把引用动作的菜单项写在了动作定义的前面,解析菜单项时找不到对应的动作记录就会抛出解析错误。需要把所有menuitem定义移到对应动作、视图记录的下方。
  4. 字段参数类型错误
    One2many字段的readonly参数传入了字符串"True",Odoo字段定义中布尔值直接传原生布尔类型即可,改为readonly=True。
  5. 视图定义不匹配
    你当前定义的视图id命名为list_dga,但arch根节点是<form>(表单视图),而动作的view_mode配置了tree,form,缺少对应的列表视图定义,需要补充dnre.dga_doc模型的tree视图,避免视图加载失败。

内容的提问来源于stack exchange,提问作者Ruben de Pina

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 09:57:29