Odoo日历视图无法显示One2many关联字段数据求助
Odoo日历视图无数据显示问题排查与修复
问题背景
需要为plannification.rotation模型创建日历视图,展示其One2many字段rotation_ids关联的relation.rotation模型中的chauffeur、vehicule等字段,但当前日历视图为空,无任何数据显示。
现有模型代码
plannification.rotation模型
class PlanificationRotatio(models.Model): _name = 'plannification.rotation' rotation_ids = fields.One2many('relation.rotation', inverse_name='planification_rotation', string="Rotation")
relation.rotation模型
class PlanifictaionRelation(models.Model): _name = 'relation.rotation' planification_rotation = fields.Many2one('plannification.rotation') ettats = fields.Selection([('suggestion', 'Suggestion'), ('valide', 'Validé')], string='États', default="suggestion") sequence = fields.Char('sequence') vehicule = fields.Many2one('fleet.vehicle', string=" Vehicules libres", readonly="True") is_selected = fields.Boolean('Selection') chauffeur = fields.Char('Chauffeur') zone = fields.Char('Zone')
现有XML视图配置
<record id="view_planfication_rotation_calendar" model="ir.ui.view"> <field name="name">planification.rotation.calendar</field> <field name="model">plannification.rotation</field> <field name="arch" type="xml"> <calendar string="Planification" date_start="date_sortie" color="states" hide_time="true" event_limit="5"> <field name="states" invisible="1"/> <field name="rotation_ids"> <calendar> <field name="chauffeur"/> <field name="vehicule"/> </calendar> </field> </calendar> </field> </record>
问题原因分析
- 缺少日历必需的日期字段:日历视图的
date_start属性指定了date_sortie,但两个模型中都未定义该字段,Odoo无法确定事件时间范围,导致无法渲染数据。 - 字段名称拼写错误:XML中引用的
states字段不存在,模型中对应字段为ettats,字段不匹配会引发视图渲染异常。 - 嵌套日历视图用法错误:Odoo日历视图不支持在One2many字段下嵌套
<calendar>标签,这种写法无法正确加载关联模型数据。 - 数据关联缺失:若
relation.rotation记录未关联到plannification.rotation记录,或主模型本身无数据,也会导致视图为空。
修复步骤
步骤1:添加日期字段
日历事件实际对应relation.rotation的每条记录,给该模型添加日期字段:
class PlanifictaionRelation(models.Model): _name = 'relation.rotation' # 新增日期字段,作为日历事件的起始时间 date_sortie = fields.Date(string="Date de sortie", required=True) # 原有字段保留 planification_rotation = fields.Many2one('plannification.rotation') ettats = fields.Selection([('suggestion', 'Suggestion'), ('valide', 'Validé')], string='États', default="suggestion") sequence = fields.Char('sequence') vehicule = fields.Many2one('fleet.vehicle', string=" Vehicules libres", readonly="True") is_selected = fields.Boolean('Selection') chauffeur = fields.Char('Chauffeur') zone = fields.Char('Zone')
步骤2:调整日历视图配置
直接基于relation.rotation模型创建日历视图,更符合事件逻辑:
<record id="view_relation_rotation_calendar" model="ir.ui.view"> <field name="name">relation.rotation.calendar</field> <field name="model">relation.rotation</field> <field name="arch" type="xml"> <calendar string="Planification des rotations" date_start="date_sortie" color="ettats" hide_time="true" event_limit="5"> <field name="ettats" invisible="1"/> <field name="chauffeur"/> <field name="vehicule"/> <field name="zone"/> <field name="planification_rotation"/> </calendar> </field> </record>
若必须基于plannification.rotation模型创建,需在主模型中添加关联日期的计算字段(如取子模型最早日期),再调整视图配置,但这种方式不如直接基于子模型直观。
步骤3:确保数据有效性
- 确认
plannification.rotation存在已保存的记录。 - 确认
relation.rotation记录已关联到对应主模型记录,且date_sortie字段已填写有效值。
步骤4:生效修改
- 升级模块,让模型和视图的修改生效。
- 清除浏览器缓存后重新加载页面,查看日历视图数据。
内容的提问来源于stack exchange,提问作者djouher
相关产品推荐
相关产品推荐

