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

Odoo 15中PDF销售报表编辑报错求助

问题

需要修改Odoo 15销售PDF报表,将客户姓名地址替换为邮箱和电话。已继承sale/report/sale_report_templates.xml中的模板,创建了sale_report_inherited.xml并更新了manifest,但更新应用时报错。

现有代码

继承模板XML文件 (sale_report_inherited.xml)

<?xml version="1.0" encoding="utf-8" ?>
<odoo>
 <template id="sale_report_inherit_template" inherit_id="report_saleorder_document">
 <xpath expr="//div[@t-field='doc.partner_id']" position="replace">

 <div t-field="doc.partner_id"
 t-options='{"widget": "contact", "fields": ["email", "phone"], "no_marker": True}' />
 </xpath>
 </template>
</odoo>

Manifest文件配置

data : [
         report/sale_report_inherited.xml',
       ]
错误信息
Traceback (most recent call last):   File
"/opt/odoo/odoo/tools/cache.py", line 85, in lookup
r = d[key]   File "/opt/odoo/odoo/tools/func.py", line 71, in wrapper
return func(self, *args, **kwargs)   File "/opt/odoo/odoo/tools/lru.py", line 34, in __getitem__
a = self.d[obj] KeyError: ('ir.model.data', <function IrModelData._xmlid_lookup at 0x7f9c9d49b250>,
'om_company.report_saleorder_document')

During handling of the above exception, another exception occurred:

Traceback (most recent call last):   File
"/opt/odoo/odoo/tools/convert.py", line 680, in _tag_root
f(rec)   File "/opt/odoo/odoo/tools/convert.py", line 658, in _tag_template
return self._tag_record(record)   File "/opt/odoo/odoo/tools/convert.py", line 567, in _tag_record
f_val = self.id_get(f_ref)   File "/opt/odoo/odoo/tools/convert.py", line 663, in id_get
res = self.model_id_get(id_str, raise_if_not_found)   File "/opt/odoo/odoo/tools/convert.py", line 669, in model_id_get
return self.env['ir.model.data']._xmlid_to_res_model_res_id(id_str,
raise_if_not_found=raise_if_not_found)   File
"/opt/odoo/odoo/addons/base/models/ir_model.py", line 1943, in
_xmlid_to_res_model_res_id
return self._xmlid_lookup(xmlid)[1:3]   File "", line 2, in _xmlid_lookup   File "/opt/odoo/odoo/tools/cache.py", line
90, in lookup
value = d[key] = self.method(*args, **kwargs)   File "/opt/odoo/odoo/addons/base/models/ir_model.py", line 1936, in
_xmlid_lookup
raise ValueError('External ID not found in the system: %s' % xmlid) ValueError: External ID not found in the system:
om_company.report_saleorder_document

The above exception was the direct cause of the following exception:

Traceback (most recent call last):   File
"/opt/odoo/odoo/addons/base/models/ir_http.py", line 237, in _dispatch
result = request.dispatch()   File "/opt/odoo/odoo/http.py", line 687, in dispatch
result = self._call_function(**self.params)   File "/opt/odoo/odoo/http.py", line 359, in _call_function
return checked_call(self.db, *args, **kwargs)   File "/opt/odoo/odoo/service/model.py", line 94, in wrapper
return f(dbname, *args, **kwargs)   File "/opt/odoo/odoo/http.py", line 348, in checked_call
result = self.endpoint(*a, **kw)   File "/opt/odoo/odoo/http.py", line 916, in __call__
return self.method(*args, **kw)   File "/opt/odoo/odoo/http.py", line 535, in response_wrap
response = f(*args, **kw)   File "/opt/odoo/addons/web/controllers/main.py", line 1346, in call_button
action = self._call_kw(model, method, args, kwargs)   File "/opt/odoo/addons/web/controllers/main.py", line 1334, in _call_kw
return call_kw(request.env[model], method, args, kwargs)   File "/opt/odoo/odoo/api.py", line 464, in call_kw
result = _call_kw_multi(method, model, args, kwargs)   File "/opt/odoo/odoo/api.py", line 451, in _call_kw_multi
result = method(recs, *args, **kwargs)   File "", line 2, in button_immediate_upgrade   File
"/opt/odoo/odoo/addons/base/models/ir_module.py", line 74, in
check_and_log
return method(self, *args, **kwargs)   File "/opt/odoo/odoo/addons/base/models/ir_module.py", line 662, in
button_immediate_upgrade
return self._button_immediate_function(type(self).button_upgrade)   File "/opt/odoo/odoo/addons/base/models/ir_module.py", line 600, in
_button_immediate_function
registry = modules.registry.Registry.new(self._cr.dbname, update_module=True)   File "/opt/odoo/odoo/modules/registry.py", line
87, in new
odoo.modules.load_modules(registry, force_demo, status, update_module)   File "/opt/odoo/odoo/modules/loading.py", line 470,
in load_modules
processed_modules += load_marked_modules(cr, graph,   File "/opt/odoo/odoo/modules/loading.py", line 363, in load_marked_modules
loaded, processed = load_module_graph(   File "/opt/odoo/odoo/modules/loading.py", line 222, in load_module_graph
load_data(cr, idref, mode, kind='data', package=package)   File "/opt/odoo/odoo/modules/loading.py", line 69, in load_data
tools.convert_file(cr, package.name, filename, idref, mode, noupdate, kind)   File "/opt/odoo/odoo/tools/convert.py", line 745, in
convert_file
convert_xml_import(cr, module, fp, idref, mode, noupdate)   File "/opt/odoo/odoo/tools/convert.py", line 811, in convert_xml_import
obj.parse(doc.getroot())   File "/opt/odoo/odoo/tools/convert.py", line 731, in parse
self._tag_root(de)   File "/opt/odoo/odoo/tools/convert.py", line 693, in _tag_root
raise ParseError('while parsing %s:%s, somewhere inside\n%s' % ( Exception

The above exception was the direct cause of the following exception:

Traceback (most recent call last):   File "/opt/odoo/odoo/http.py",
line 643, in _handle_exception
return super(JsonRequest, self)._handle_exception(exception)   File "/opt/odoo/odoo/http.py", line 301, in _handle_exception
raise exception.with_traceback(None) from new_cause odoo.tools.convert.ParseError: while parsing None:3, somewhere inside

        <div t-field="doc.partner_id" t-options="{&quot;widget&quot;: &quot;contact&quot;,

"fields": ["email", "phone"],
"no_marker": True}"/>
问题修复

1. 修正继承模板的XMLID

错误提示找不到om_company.report_saleorder_document,原因是inherit_id缺少正确的模块前缀。原销售订单报表模板的XMLID是sale.report_saleorder_document,需要给inherit_id补充模块前缀:

<template id="sale_report_inherit_template" inherit_id="sale.report_saleorder_document">

2. 修正Manifest文件的语法错误

Manifest中路径字符串左侧缺少单引号,导致Python语法解析错误,修正后:

data = [
    'report/sale_report_inherited.xml',
]

3. 优化XML中t-options的格式(可选)

当前写法可正常工作,但若出现解析问题,可将代码紧凑化或统一使用转义双引号包裹属性值:

<div t-field="doc.partner_id" t-options='{"widget": "contact", "fields": ["email", "phone"], "no_marker": True}' />

或者:

<div t-field="doc.partner_id" t-options="{&quot;widget&quot;: &quot;contact&quot;, &quot;fields&quot;: [&quot;email&quot;, &quot;phone&quot;], &quot;no_marker&quot;: true}" />
完整修正后的代码

XML文件

<?xml version="1.0" encoding="utf-8" ?>
<odoo>
    <template id="sale_report_inherit_template" inherit_id="sale.report_saleorder_document">
        <xpath expr="//div[@t-field='doc.partner_id']" position="replace">
            <div t-field="doc.partner_id" t-options='{"widget": "contact", "fields": ["email", "phone"], "no_marker": True}' />
        </xpath>
    </template>
</odoo>

Manifest文件

data = [
    'report/sale_report_inherited.xml',
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 13:47:12