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

