Odoo 16树形视图设置列宽报错,寻求有效解决方案
调整Odoo 16树形视图列宽的正确方法(解决ParseError报错)
问题背景
环境:Ubuntu 22.04桌面版,Odoo 16 + PyCharm CE
现有树形视图包含4列,name列占用近80%空间,尝试通过给<field>标签添加style属性调整列宽:
<field name="name" style="width: 50px !important;"/>
模块升级时触发ParseError,报错信息如下:
Traceback (most recent call last): File "/home/odoo16/odoo-server/odoo/http.py", line 1587, in _serve_db return service_model.retrying(self._serve_ir_http, self.env) File "/home/odoo16/odoo-server/odoo/service/model.py", line 134, in retrying result = func() File "/home/odoo16/odoo-server/odoo/http.py", line 1614, in _serve_ir_http response = self.dispatcher.dispatch(rule.endpoint, args) File "/home/odoo16/odoo-server/odoo/http.py", line 1811, in dispatch result = self.request.registry['ir.http']._dispatch(endpoint) File "/home/odoo16/odoo-server/addons/website/models/ir_http.py", line 235, in _dispatch response = super()._dispatch(endpoint) File "/home/odoo16/odoo-server/odoo/addons/base/models/ir_http.py", line 154, in _dispatch result = endpoint(**request.params) File "/home/odoo16/odoo-server/odoo/http.py", line 700, in route_wrapper result = endpoint(self, *args, **params_ok) File "/home/odoo16/odoo-server/addons/web/controllers/dataset.py", line 46, in call_button action = self._call_kw(model, method, args, kwargs) File "/home/odoo16/odoo-server/addons/web/controllers/dataset.py", line 33, in _call_kw return call_kw(request.env[model], method, args, kwargs) File "/home/odoo16/odoo-server/odoo/api.py", line 461, in call_kw result = _call_kw_multi(method, model, args, kwargs) File "/home/odoo16/odoo-server/odoo/api.py", line 448, in _call_kw_multi result = method(recs, *args, **kwargs) File "<decorator-gen-80>", line 2, in button_immediate_upgrade File "/home/odoo16/odoo-server/odoo/addons/base/models/ir_module.py", line 76, in check_and_log return method(self, *args, **kwargs) File "/home/odoo16/odoo-server/odoo/addons/base/models/ir_module.py", line 678, in button_immediate_upgrade return self._button_immediate_function(type(self).button_upgrade) File "/home/odoo16/odoo-server/odoo/addons/base/models/ir_module.py", line 615, in _button_immediate_function registry = modules.registry.Registry.new(self._cr.dbname, update_module=True) File "<decorator-gen-14>", line 2, in new File "/home/odoo16/odoo-server/odoo/tools/func.py", line 87, in locked return func(inst, *args, **kwargs) File "/home/odoo16/odoo-server/odoo/modules/registry.py", line 90, in new odoo.modules.load_modules(registry, force_demo, status, update_module) File "/home/odoo16/odoo-server/odoo/modules/loading.py", line 483, in load_modules processed_modules += load_marked_modules(cr, graph, File "/home/odoo16/odoo-server/odoo/modules/loading.py", line 371, in load_marked_modules loaded, processed = load_module_graph( File "/home/odoo16/odoo-server/odoo/modules/loading.py", line 230, in load_module_graph load_data(cr, idref, mode, kind='data', package=package) File "/home/odoo16/odoo-server/odoo/modules/loading.py", line 71, in load_data tools.convert_file(cr, package.name, filename, idref, mode, noupdate, kind) File "/home/odoo16/odoo-server/odoo/tools/convert.py", line 763, in convert_file convert_xml_import(cr, module, fp, idref, mode, noupdate) File "/home/odoo16/odoo-server/odoo/tools/convert.py", line 829, in convert_xml_import obj.parse(doc.getroot()) File "/home/odoo16/odoo-server/odoo/tools/convert.py", line 749, in parse self._tag_root(de) File "/home/odoo16/odoo-server/odoo/tools/convert.py", line 709, in _tag_root raise ParseError(msg) from None # Restart with "--log-handler odoo.tools.convert:DEBUG" for complete traceback odoo.tools.convert.ParseError: while parsing /home/odoo16/odoo-server/custom_addons/om_hospital/views/units_config.xml:38 Invalid view unitsconfig.tree (om_hospital.config_unit_types_tree_view) definition in om_hospital/views/units_config.xml View error context: '-no context-' The above server error caused the following client error: RPC_ERROR: Odoo Server Error RPCError@http://localhost:8069/web/assets/debug/web.assets_backend.js:10193:9 (/web/static/src/core/network/rpc_service.js:11) makeErrorFromResponse@http://localhost:8069/web/assets/debug/web.assets_backend.js:10216:19 (/web/static/src/core/network/rpc_service.js:34) jsonrpc/promise</<@http://localhost:8069/web/assets/debug/web.assets_backend.js:10269:48 (/web/static/src/core/network/rpc_service.js:87)
错误原因
Odoo的XML视图解析器不允许给<field>标签直接添加style属性,这属于非法的XML视图定义,因此触发ParseError。
解决方案
方法一:使用<column>标签包裹字段设置宽度
在树形视图的<tree>标签内,用<column>标签包裹需要调整宽度的字段,通过width属性指定宽度值,示例:
<tree string="Units Config"> <!-- 给name列设置宽度 --> <column width="120"> <field name="name"/> </column> <!-- 其他字段列 --> <column width="80"> <field name="code"/> </column> <column width="100"> <field name="capacity"/> </column> <field name="active"/> <!-- 不设置宽度则自动分配 --> </tree>
width属性支持像素值(如120)或百分比(如"25%")- 表头宽度会自动与列内容宽度匹配,无需额外配置
方法二:通过自定义CSS文件控制样式
如果需要更灵活的全局或特定视图样式控制,可采用CSS方案:
- 在模块目录下创建
static/src/css/tree_view_custom.css文件,添加样式:
/* 针对特定视图的name列设置宽度 */ .o_list_view[data-view-id="om_hospital.config_unit_types_tree_view"] .o_list_column[name="name"] { width: 120px !important; } /* 全局所有树形视图的name列设置宽度 */ /* .o_list_view .o_list_column[name="name"] { width: 120px !important; } */
- 在模块的
__manifest__.py中引入该CSS文件:
'assets': { 'web.assets_backend': [ 'om_hospital/static/src/css/tree_view_custom.css', ], },
- 替换
om_hospital为你的实际模块名称 - 此方法不会触发XML解析错误,样式控制更精准
内容的提问来源于stack exchange,提问作者Ahmed Haroon
相关产品推荐
相关产品推荐

