Tryton关联字段搜索时未显示自定义属性、异常展示ID的问题排查
问题根因定位
- 直接触发异常的核心原因是自定义
get_rec_name方法用了Tryton 2.x版本就已经废弃的旧写法,完全不兼容当前使用的新版本框架,自定义记录展示逻辑完全没有生效。
你当前写的def get_rec_name(self, position): return self.position存在两个致命问题:- 方法签名和新版本框架要求的入参完全不匹配,框架在调用该方法时会触发静默错误,自定义展示逻辑直接失效;
- 取值逻辑错误,代码里的
return self.position是取模型类上绑定的字段定义对象,根本拿不到具体业务记录里的position字段值。
当框架拿不到自定义的记录展示值时,会自动 fallback 到展示模型内置的主键id字段,这就是你看到的、从未在代码中定义的“ID属性提示”的来源。
- 第二个遗漏的配置项:没有为
meta.position模型配置基础列表视图。Tryton 默认不会自动把模型的业务字段暴露给关联字段的搜索弹窗使用,没有显式声明视图字段的情况下,弹窗只会加载系统内置的id字段,自然看不到你定义的position、area内容。
可落地的修复步骤
- 修正
meta.position模型的接口实现,替换错误的get_rec_name逻辑:
按照Tryton官方API约定,get_rec_name是类级方法,需要加装饰器,返回记录ID到展示字符串的映射,同时补充搜索匹配逻辑让关联搜索能识别position、area字段:class MetaPosition(ModelSQL, ModelView): __name__ = 'meta.position' position = fields.Char('Position', translate=True, required=True) area = fields.Char('Area', translate=True, required=True) @classmethod def get_rec_name(cls, records, name): # 为每条生成可展示的名称,例如 "A (ar1)" return { record.id: f"{record.position} ({record.area})" for record in records } @classmethod def search_rec_name(cls, name, clause): # 支持关联字段搜索时按position、area值匹配 return [ 'OR', ('position',) + clause[1:], ('area',) + clause[1:], ] - 补充模型的基础列表视图配置,新建视图XML文件并注册到
tryton.cfg:
配置最小化的Tree视图,把需要展示的position、area字段纳入视图范围,让关联搜索弹窗能正常加载这些字段:<record model="ir.ui.view" id="meta_position_tree_view"> <field name="model">meta.position</field> <field name="type">tree</field> <field name="arch" type="string"> <tree string="Position List"> <field name="position"/> <field name="area"/> </tree> </field> </record> - 校验模块加载状态:
代码和配置修改完成后,对开发中的模块执行版本升级,确保position.xml里的两条预置初始化记录被正确导入数据库;同时检查当前用户所属权限组,确保对meta.position模型有读权限,避免因为权限不足导致业务字段加载失败。
内容的提问来源于stack exchange,提问作者Developer23
相关产品推荐
相关产品推荐

