跳至内容

Odoo 20 列表视图开发全指南:标签属性、组件、可选列与高级用法

2026年10月21日 由
Odoo 20 列表视图开发全指南:标签属性、组件、可选列与高级用法
中国 Odoo, 苏州远鼎
视图是Odoo界面的基础组件。视图类型包含表单视图、看板视图、图表视图、透视视图、活动视图、日历视图等,其中列表视图是最常用的界面,用来浏览、筛选、排序和管理大量业务数据。
从Odoo 18开始,延续至Odoo 19、Odoo 20,Odoo统一使用 <list> 作为根标签,不再使用旧版 <tree> 标签。列表视图高效灵活、功能丰富,支持列分组 <column>、批量操作、小组件、操作权限控制以及可选列。
在这份详细教程中,你将学习:
• 在 Odoo 20 中创建自定义模型与窗口动作
• 列表视图的新标准写法
• 列表视图根标签属性详解、语法及示例
• 列表行内交互组件的使用
• 可选列配置(optional="show" / optional="hide")
• 高级配置:列分组、表头按钮、底部聚合统计
1. 创建模型
我们先新建一个示例模型 student.record,包含多种字段类型(字符、浮点、下拉选择、日期、多对一、多对多、布尔、整型),用来演示列表视图各项功能。 文件路径:models/student_record.py
# -*- coding: utf-8 -*-
from odoo import fields, models

class StudentRecord(models.Model):
    _name = 'student.record'
    _description = 'Student Record'
    _order = 'sequence, id desc'

    sequence = fields.Integer(string='Sequence', default=10)
    name = fields.Char(string='Student Name', required=True)
    roll_number = fields.Char(string='Roll Number')
    email = fields.Char(string='Email')
    phone = fields.Char(string='Phone')
    class_teacher_id = fields.Many2one('res.users', string='Class Teacher')
    tag_ids = fields.Many2many('res.partner.category', string='Tags')
    admission_date = fields.Date(string='Admission Date', default=fields.Date.context_today)
    fee_amount = fields.Monetary(string='Tuition Fee', currency_field='currency_id')
    currency_id = fields.Many2one(
        'res.currency',
        string='Currency',
        default=lambda self: self.env.company.currency_id
    )
    progress = fields.Float(string='Course Progress (%)', default=0.0)
    priority = fields.Selection([
        ('0', 'Low'),
        ('1', 'Normal'),
        ('2', 'High'),
        ('3', 'Very High')
    ], string='Priority', default='1')
    state = fields.Selection([
        ('draft', 'Draft'),
        ('enrolled', 'Enrolled'),
        ('graduated', 'Graduated'),
        ('cancelled', 'Cancelled')
    ], string='Status', default='draft')
    is_active_student = fields.Boolean(string='Active Status', default=True)
2. 定义窗口动作与菜单
在 Odoo 18、19、20 中,view_mode 字段必须填写 list,form,不再使用旧写法 tree,form。 文件路径:views/student_record_views.xml
<?xml version="1.0" encoding="utf-8"?>
<odoo>
    <!-- 动作 -->
    <record id="action_student_record" model="ir.actions.act_window">
        <field name="name">Students</field>
        <field name="res_model">student.record</field>
        <field name="view_mode">list,form</field>
        <field name="help" type="html">
            <p class="o_view_nocontent_smiling_face">
                Register your first student!
            </p>
        </field>
    </record>

    <!-- 一级菜单与子菜单 -->
    <menuitem id="menu_student_root" name="Student Management" sequence="10"/>
    <menuitem id="menu_student_records"
              name="Students"
              parent="menu_student_root"
              action="action_student_record"
              sequence="10"/>
</odoo>
3. 创建基础列表视图
Odoo 20 的列表视图,在视图的 arch xml 节点内使用 <list> 根标签定义。
<record id="view_student_record_list" model="ir.ui.view">
    <field name="name">student.record.list</field>
    <field name="model">student.record</field>
    <field name="arch" type="xml">
        <list string="Students">
            <field name="sequence" widget="handle"/>
            <field name="name"/>
            <field name="roll_number"/>
            <field name="class_teacher_id"/>
            <field name="admission_date"/>
            <field name="fee_amount"/>
            <field name="state"/>
        </list>
    </field>
</record>
4. Odoo 20 列表视图全部根标签属性
可以直接写在 <list> 根标签上的属性,用来控制权限、布局、排序、批量操作等:
4.1 create(布尔)
控制用户是否可以在列表视图直接新建记录。 可选值:"1"/"0"(或 "true"/"false"),默认值 "1"
<list create="0">
控制面板上的【新建】按钮将隐藏。
4.2 edit(布尔)
控制是否允许在该视图内编辑记录。 可选值:"1" / "0",默认 "1"
<list edit="0">
4.3 delete(布尔)
禁止用户通过操作(齿轮)菜单删除记录。 可选值:"1" / "0",默认 "1"
<list delete="0">
选中记录后,操作菜单里的【删除】选项消失。
4.4 duplicate(布尔)
控制是否允许在多选操作菜单里复制记录。 可选值:"1" / "0",默认 "1"
<list duplicate="0">
4.5 import(布尔)
开启/关闭表格、CSV导入功能。 可选值:"1"/"0",默认 "1"
<list import="0">
齿轮菜单中的【导入记录】隐藏。
4.6 export_xlsx(布尔)
开启/关闭直接导出Excel功能。 可选值:"1" / "0",默认 "1"
<list export_xlsx="0">
搜索栏旁的Excel导出按钮隐藏。
4.7 分组操作权限:group_create, group_edit, group_delete(布尔)
Odoo 20 新增配置,用于列表分组场景:
• group_create="0":禁止在分组行内新建记录
• group_edit="0":禁止编辑分组行
• group_delete="0":禁止删除分组
4.8 editable(字符串)
将只读列表变为可编辑表格,支持像Excel一样直接新增、修改行数据,不用打开表单。 可选值:"top"(新增行在顶部)、"bottom"(新增行在底部)
<list editable="bottom">
4.9 open_form_view(布尔)
开启后,点击行会进入编辑模式,而不是打开表单;open_form_view="1" 时,每行单独显示打开表单的图标按钮。 可选值:"1" / "0"
<list editable="bottom" open_form_view="1">
4.10 multi_edit(布尔)
支持复选框多选记录,批量修改选中记录字段。 可选值:"1" / "0"
<list multi_edit="1">
选中多条记录修改字段时,Odoo会弹窗询问是否把修改应用到全部选中记录。
4.11 no_open(布尔)
点击行时,禁止打开表单视图。 可选值:"1" / "0"
<list no_open="1">
4.12 default_group_by(字符串)
视图打开时,自动按指定字段分组,多字段用逗号分隔。
<list default_group_by="state">
4.13 expand(布尔)
配合分组(default_group_by或搜索筛选)使用,控制分组默认是否展开。 可选值:"1" / "0",默认 "0"
<list default_group_by="state" expand="1">
4.14 default_order(字符串)
覆盖模型 _order 定义的默认排序。格式:字段名 + asc / desc
<list default_order="admission_date desc, name asc">
4.15 limit & groups_limit(整型)
• limit:每页最大显示行数(普通视图默认80,x2many子列表默认40)
• groups_limit:分页前最多展示多少个分组
<list limit="20" groups_limit="5">
4.16 sample(布尔)
数据表为空时,展示示例模拟数据,预览界面效果。 可选值:"1" / "0"
<list sample="1">
4.17 行样式修饰(decoration-<样式>)
根据前端上下文布尔表达式动态给行上色。 样式可选:
• decoration-success:绿色文字
• decoration-danger:红色文字
• decoration-warning:土黄/橙色文字
• decoration-info:蓝色文字
• decoration-muted:灰色文字
• decoration-primary:紫色文字
• decoration-bf:粗体
• decoration-it:斜体
<list decoration-success="state == 'graduated'"
      decoration-info="state == 'enrolled'"
      decoration-muted="state == 'cancelled'"
      decoration-bf="state == 'enrolled'">
5. Odoo 20 列表视图字段组件(widget)
组件可以把原生字段变成可视化交互元素,在 <field> 标签上使用 widget 属性声明:
组件 适用字段 说明
badge Selection、Char 彩色文字标签
priority Selection、Integer 星级评分,列表可直接点击
boolean_toggle Boolean 开关,替代复选框
boolean_favorite Boolean 收藏星星开关
handle Integer 拖拽排序手柄
progressbar Float、Integer 0–100进度条
many2one_avatar_user Many2one(res.users) 用户头像+名称
many2many_tags Many2many 彩色标签胶囊
monetary Monetary、Float 带货币符号金额格式化
float_time Float 小数转为时分格式,如2.5 → 02:30
copy_clipboard Char, Text 点击图标复制内容到剪贴板
image Binary 二进制字段内嵌图片
组件示例:
<!-- 排序拖拽手柄 -->
<field name="sequence" widget="handle"/>
<!-- 激活状态开关 -->
<field name="is_active_student" widget="boolean_toggle"/>
<!-- 星级优先级 -->
<field name="priority" widget="priority"/>
<!-- 用户头像 -->
<field name="class_teacher_id" widget="many2one_avatar_user"/>
<!-- 彩色标签 -->
<field name="tag_ids" widget="many2many_tags" options="{'color_field': 'color'}"/>
<!-- 进度条 -->
<field name="progress" widget="progressbar"/>
<!-- 状态标签+动态颜色 -->
<field name="state"
       widget="badge"
       decoration-success="state == 'graduated'"
       decoration-info="state == 'enrolled'"
       decoration-warning="state == 'draft'"
       decoration-danger="state == 'cancelled'"/>
6. 可选列配置
可选列是列表视图高频功能,终端用户无需开发,自行调整表格显示字段。 使用方式:列表表头右上角三点菜单,勾选控制字段显示隐藏。 用户的列偏好自动保存在本地会话存储。
• optional="show":视图打开默认显示,用户可手动取消隐藏
• optional="hide":视图打开默认隐藏,用户可手动勾选调出
<field name="name"/> <!-- 默认显示,用户可隐藏 -->
<field name="roll_number" optional="show"/>
<field name="admission_date" optional="show"/>
<!-- 默认隐藏,减少界面拥挤,按需开启 -->
<field name="email" optional="hide"/>
<field name="phone" optional="hide"/>
<field name="progress" widget="progressbar" optional="hide"/>
column_invisible / invisible / optional 核心区别
• column_invisible="条件":整列按权限/父条件隐藏,用户不能修改
• invisible="条件":单元格内容隐藏,列表表头仍然可见
• optional="show|hide":交由终端用户在表头菜单自主控制
7. Odoo 20 列表视图高级功能
7.1 列分组 <column>
Odoo 20 使用 <column> 标签把多个字段合并到同一个表头下,适合订单行(产品+规格)这类紧凑表格。
<column name="student_contact" string="Contact Info" width="250px">
    <field name="email" placeholder="Email address..."/>
    <field name="phone" placeholder="Phone number..."/>
</column>
<column> 内部字段同样支持 optional="hide" / optional="show"
7.2 表头按钮 <header>
写在 <header> 内的按钮,只有勾选至少一行记录时才显示,用于批量操作:
<list string="Students" multi_edit="1">
    <header>
        <button name="action_bulk_enroll"
                type="object"
                string="Enroll Selected"
                class="btn-primary"/>
    </header>
    <field name="name"/>
    <!-- 其他字段 -->
</list>
7.3 底部聚合统计(sum、avg、min、max)
数值字段底部自动汇总:合计、平均值、最小值、最大值
<field name="fee_amount" widget="monetary" sum="Total Tuition Fee"/>
<field name="progress" widget="progressbar" avg="Average Progress"/>
8. 完整可运行示例XML
整合属性、组件、列分组、可选列的完整列表视图:
<?xml version="1.0" encoding="utf-8"?>
<odoo>
    <record id="view_student_record_list_full" model="ir.ui.view">
        <field name="name">student.record.list.full</field>
        <field name="model">student.record</field>
        <field name="arch" type="xml">
            <list string="Student Records"
                  editable="bottom"
                  open_form_view="1"
                  multi_edit="1"
                  sample="1"
                  default_order="admission_date desc, name asc"
                  decoration-success="state == 'graduated'"
                  decoration-info="state == 'enrolled'"
                  decoration-muted="state == 'cancelled'">
                <!-- 表头批量按钮(选中行才可见) -->
                <header>
                    <button name="action_bulk_enroll"
                            type="object"
                            string="Enroll Selected"
                            class="btn-primary"/>
                </header>
                <!-- 拖拽排序 -->
                <field name="sequence" widget="handle"/>
                <!-- 核心必选字段 -->
                <field name="name"/>
                <field name="roll_number" optional="show"/>
                <!-- 用户头像多对一 -->
                <field name="class_teacher_id"
                       widget="many2one_avatar_user"
                       optional="show"/>
                <!-- 多对多标签 -->
                <field name="tag_ids"
                       widget="many2many_tags"
                       options="{'color_field': 'color'}"
                       optional="show"/>
                <!-- 分组列:联系方式 -->
                <column name="contact_details" string="Contact Info" optional="show">
                    <field name="email" widget="email"/>
                    <field name="phone" widget="phone"/>
                </column>
                <!-- 日期 + 带汇总金额 -->
                <field name="admission_date" optional="show"/>
                <field name="fee_amount"
                       widget="monetary"
                       sum="Total Fees"
                       optional="show"/>
                <!-- 进度条 -->
                <field name="progress"
                       widget="progressbar"
                       optional="hide"/>
                <!-- 星级优先级 -->
                <field name="priority"
                       widget="priority"
                       optional="show"/>
                <!-- 布尔开关 -->
                <field name="is_active_student"
                       widget="boolean_toggle"
                       string="Active"
                       optional="hide"/>
                <!-- 状态彩色标签 -->
                <field name="state"
                       widget="badge"
                       decoration-success="state == 'graduated'"
                       decoration-info="state == 'enrolled'"
                       decoration-warning="state == 'draft'"
                       decoration-danger="state == 'cancelled'"
                       optional="show"/>
            </list>
        </field>
    </record>
</odoo>
Odoo 20 的列表视图给开发者提供很高自由度,可以打造交互强、适配业务的数据界面。 用好:
• 根标签属性:editable、multi_edit、open_form_view、权限控制(create、edit、delete、export_xlsx)
• 交互组件:badge、priority、progressbar、boolean_toggle、many2one_avatar_user
• 可选列 optional="show"/"optional="hide" 以及 <column> 列分组 就能实现体验友好的列表界面。

.

Odoo 20 列表视图开发全指南:标签属性、组件、可选列与高级用法
中国 Odoo, 苏州远鼎 2026年10月21日
标签
存档