You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Odoo开发如何将三个字段列合并为tree视图单列展示

Odoo tree视图多字段合并为单列实现方法

直接修改tree视图的arch结构无法实现多字段同列展示,因为tree视图下每个<field>标签默认对应独立列,没有内置的字段拼接语法,推荐用以下两种方案实现:


方案1:新增计算字段(通用推荐,兼容所有Odoo版本)

这个方案灵活性最高,不会影响模型在其他场景的显示逻辑,支持自定义拼接格式、搜索排序。

  1. 修改模型代码,新增专门用于合并展示的计算字段,拼接逻辑可以根据需求自定义:
from odoo import models, fields, api

class academy(models.Model):
    _name = 'academy'
    _description = 'academy'

    name = fields.Char(string="Имя")
    lastname = fields.Char(string="Фамилия")
    age = fields.Integer(string="Возраст")
    # 新增合并展示字段,store=True表示将值存入数据库,提升列表加载速度,支持搜索排序
    full_info = fields.Char(string="人员信息", compute="_compute_full_info", store=True)
    description = fields.Text(string="Дополнительно")
    image = fields.Binary(string="Фотография")

    def _default_my_date(self):
        return fields.Date.context_today(self)

    date = fields.Date(string="Дата", default=_default_my_date)

    # 依赖被合并的三个字段,任意一个字段值变化时自动更新合并内容
    @api.depends('name', 'lastname', 'age')
    def _compute_full_info(self):
        for record in self:
            # 处理空值避免拼接出现多余空格
            name_part = f"{record.name or ''} {record.lastname or ''}".strip()
            # 自定义拼接格式,这里示例为「姓名 姓氏(年龄)」
            record.full_info = f"{name_part}({record.age}岁)" if record.age else name_part
  1. 修改tree视图代码,删除原来单独展示的三个字段,替换为新增的合并字段:
<record id="view_academy_tree" model="ir.ui.view">
    <field name="name">academy.tree</field>
    <field name="model">academy</field>
    <field name="arch" type="xml">
        <tree>
            <!-- 替换原来的name、lastname、age三个独立字段 -->
            <field name="full_info"/>
            <field name="description"/>
            <field name="date"/>
        </tree>
    </field>
</record>

方案2:重写name_get方法(适合合并内容为记录默认展示名的场景)

如果不需要单独控制列表页的展示逻辑,希望该模型在下拉选择、关联字段引用等所有场景都显示合并后的内容,可以直接重写模型的name_get方法,不需要新增字段:

  1. 在模型类中添加如下重写代码:
def name_get(self):
    result = []
    for record in self:
        name_part = f"{record.name or ''} {record.lastname or ''}".strip()
        show_text = f"{name_part}({record.age}岁)" if record.age else name_part
        result.append((record.id, show_text))
    return result
  1. 修改tree视图,将原来的三个字段替换为内置的display_name字段即可:
<tree>
    <field name="display_name"/>
    <field name="description"/>
    <field name="date"/>
</tree>

注意:代码修改完成后需要升级你的academy自定义模块,刷新浏览器缓存后即可看到效果。

内容的提问来源于stack exchange,提问作者Dread

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 04:57:23