Odoo模块开发问题:Many2one作为选择字段显示异常
解决Odoo Many2one字段显示模型名+ID而非城市名称的问题
这个问题核心是Odoo没法确定你的城市模型该用哪个字段作为记录的显示名称,所以默认展示了模型标识+ID。下面是几种实用的解决方案,你可以根据自己的场景选:
1. 给目标模型设置_rec_name属性
这是最直接的方式,明确告诉Odoo用哪个字段来显示记录名称:
假设你的城市模型定义是这样的,直接加一行_rec_name配置就行:
from odoo import models, fields class Ville(models.Model): _name = 'ville' # 对应你Many2one字段里的comodel_name _rec_name = 'ville_en_francais' # 指定用这个字段的值作为显示名称 ville_en_francais = fields.Char(string="Ville en français") # 其他字段...
设置完成后,所有关联这个模型的Many2one字段都会自动显示ville_en_francais的内容。
2. 重写目标模型的name_get()方法
如果需要更灵活的显示逻辑(比如同时展示城市名和邮编),可以自定义name_get()方法来控制显示内容:
class Ville(models.Model): _name = 'ville' ville_en_francais = fields.Char(string="Ville en français") code_postal = fields.Char(string="Code postal") def name_get(self): result = [] for ville in self: # 自定义显示格式,比如"城市名 (邮编)",没有邮编就只显示城市名 display_name = f"{ville.ville_en_francais} ({ville.code_postal})" if ville.code_postal else ville.ville_en_francais result.append((ville.id, display_name)) return result
这种方法适合需要组合多个字段作为显示名称的场景。
3. 检查Many2one字段的定义
先确认你的Many2one字段指定了正确的comodel_name,别写错模型名:
ville_id = fields.Many2one('ville', string="Ville")
如果comodel_name写错,Odoo找不到对应模型,也会出现这种异常显示。
4. 视图层面的小检查
如果只是某个特定视图显示异常,看看视图里的Many2one字段有没有错用widget,默认用many2one widget就好,别误设成selection之类的:
<field name="ville_id" widget="many2one"/>
按照上面的方法调整后,你的Many2one字段应该就能正常显示数据库里ville_en_francais的内容啦。
内容的提问来源于stack exchange,提问作者Rad304
相关产品推荐
相关产品推荐

