Odoo 16表单视图中如何实现同一地址字段两种显示形式?
Odoo 16 同一字段两种显示形式的解决方案
问题原因
你当前的写法无效,是因为res.partner模型默认的name_get方法并未读取show_address上下文参数来调整显示内容,所以无论传递什么上下文,字段都会按照默认规则显示名称加地址。
解决思路一:重写res.partner的name_get方法
通过上下文控制name_get的返回值,让字段根据不同上下文显示不同内容:
- 在自定义模块中重写
res.partner模型:
from odoo import models, api class ResPartner(models.Model): _inherit = 'res.partner' @api.multi def name_get(self): result = [] show_address = self.env.context.get('show_address', False) for partner in self: if show_address: # 自定义名称+地址的显示格式 address_parts = [partner.street, partner.city, partner.zip] address = ', '.join(part for part in address_parts if part) name = f"{partner.name}\n{address}" if address else partner.name else: # 仅显示名称 name = partner.name result.append((partner.id, name)) return result
- 修改视图XML代码:
给两个字段传递不同上下文,第一个字段显式指定不显示地址:
<group> <group> <field name="partner_shipping_id" context="{'show_address': 0}"/> </group> <group> <field name="partner_shipping_id" context="{'show_address': 1}" options="{'always_reload': True, 'no_open':true}" readonly="1"/> </group> </group>
解决思路二:使用关联字段(Related Field)
在当前模型中新增仅关联合作伙伴名称的字段,无需修改原模型的显示逻辑:
- 在当前模型中新增关联字段:
from odoo import models, fields class YourModel(models.Model): _inherit = 'your.model.name' # 替换为你实际使用的模型名称 partner_shipping_name = fields.Char(related='partner_shipping_id.name', string='Shipping Partner Name')
- 修改视图XML代码:
第一个字段用新增的关联字段显示名称,第二个用原字段显示完整信息:
<group> <group> <field name="partner_shipping_name"/> </group> <group> <field name="partner_shipping_id" options="{'always_reload': True, 'no_open':true}" readonly="1"/> </group> </group>
注意事项
- 思路一适合需要全局统一控制合作伙伴显示格式的场景,但需要开发自定义模块;
- 思路二更轻量化,仅针对当前模型需求,不会影响其他业务场景的合作伙伴字段显示。
内容的提问来源于stack exchange,提问作者Consep
相关产品推荐
相关产品推荐

