Odoo16嵌套树视图重启服务器后初始空白,点击后才显示数据
Odoo16嵌套树视图初始空白问题解决方案
问题现象
在Odoo16中实现树视图嵌套展示数据,定义job.description与job.description.details两个模型,通过details_ids(One2many字段)关联。新增数据时可正常保存并显示,但服务器重启后,打开记录时嵌套的树视图初始为空白,点击表头或添加行后数据才会显示。尝试将details_ids改为compute字段后,数据完全消失。
问题原因
- 视图XML配置错误:嵌套树视图指定的
view_id为view_work_plan_goals_tree,但实际定义的子模型树视图ID是view_job_description_details_tree,ID不匹配导致初始加载时无法正确渲染子视图数据。 - Compute字段误用:将原生One2many字段改为compute字段时,搜索条件错误(用
record.job_id.id替代了当前记录的id),且未配置inverse方法,导致数据无法正确关联和存储,最终数据消失。此外重写read方法属于多余操作,反而干扰了Odoo的原生数据读取逻辑。
解决方案
1. 修正视图XML配置
将嵌套树视图的view_id改为正确的子模型树视图ID,确保视图关联正确:
<odoo> <data> <record id="view_job_description_details_tree" model="ir.ui.view"> <field name="name">job.description.details.tree</field> <field name="model">job.description.details</field> <field name="arch" type="xml"> <tree editable="bottom"> <field name="key_result_area"/> <field name="principal_accountabilities"/> </tree> </field> </record> <record id="view_job_description_tree" model="ir.ui.view"> <field name="name">job.description.form</field> <field name="model">job.description</field> <field name="arch" type="xml"> <tree> <field name="job_id"/> <field name="job_purpose"/> <field name="details_ids" widget="one2many_list" options="{'no_create': True}"> <!-- 修正view_id为正确的子视图ID --> <tree string="Details" editable="bottom" view_id="view_job_description_details_tree"/> </field> </tree> </field> </record> </data> </odoo>
2. 恢复原生One2many字段定义
不需要使用compute字段,保留最初的模型关联即可,Odoo原生One2many字段会自动维护关联关系:
class JobDescription(models.Model): _name = 'job.description' _description = 'Job Description' job_id = fields.Many2one('hr.job', string='Job Position', readonly=True) job_purpose = fields.Text(string='Job Purpose', required=True) # 保留原生One2many字段,无需compute details_ids = fields.One2many('job.description.details', 'job_description_id', string='Details')
class JobDescriptionDetails(models.Model): _name = 'job.description.details' _description = 'Job Description Details' key_result_area = fields.Text(string='Key Result Area', required=True) principal_accountabilities = fields.Text(string='Principal Accountabilities', required=True) job_description_id = fields.Many2one('job.description', string='Work Plan', ondelete='cascade') # 添加ondelete='cascade',确保主记录删除时子记录同步删除
3. 生效配置
完成代码修正后,升级对应模块,清除Odoo缓存并重启服务器,确保配置生效。
内容的提问来源于stack exchange,提问作者HelpDesk Jhpiego
相关产品推荐
相关产品推荐

