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

Odoo 10如何在按钮函数中获取表单视图所有字段及值到字典

解决Odoo表单视图获取所有字段值到字典的方案

嘿,我来帮你搞定这个问题~首先得说清楚:你之前试的fields_get()、fields_view_get()和name_get()确实不是用来拿字段实际值的——fields_get()是获取字段的元数据(比如类型、标签这些配置信息),fields_view_get()是拿视图的结构定义,name_get()只返回记录的显示名称,所以肯定拿不到你要的字段值啦。

下面给你几个在按钮函数里直接能用的可行方案:

方法一:用read()方法(最直接高效)

在按钮对应的模型方法里,self代表当前触发按钮的记录集。表单视图里一般都是单条记录,直接用self.read()[0]就能得到包含所有字段及对应值的字典:

def button_get_all_fields(self):
    # 获取当前记录的所有字段及值的字典
    record_dict = self.read()[0]
    # 这里可以对字典做后续处理,比如打印或存储
    print(record_dict)
    return True

read()默认会返回所有字段(包括关联字段的ID),如果想指定只获取某些字段,也可以传字段列表参数,比如self.read(['name', 'email'])[0]。要是想让关联字段直接显示名称而非ID,可以加load='_classic_read'参数:self.read(load='_classic_read')[0]。

方法二:用__dict__(轻量快速)

如果只需要当前记录的普通字段值(排除Odoo框架自带的内部属性),可以直接访问self.__dict__,记得过滤掉开头是下划线的内部属性:

def button_get_all_fields(self):
    # 过滤掉Odoo内部属性,只保留业务字段
    record_dict = {k: v for k, v in self.__dict__.items() if not k.startswith('_')}
    print(record_dict)
    return True

这个方法更轻量,但关联字段通常只会显示ID,适合不需要处理关联字段的简单场景。

方法三:手动遍历字段(自定义程度高)

如果需要精确控制哪些字段被包含,或者要对特殊字段(比如二进制字段、One2many)做单独处理,可以先通过fields_get()拿到所有字段名,再遍历获取对应值:

def button_get_all_fields(self):
    # 获取当前模型的所有字段名列表
    field_names = list(self.fields_get().keys())
    record_dict = {}
    for field in field_names:
        # 逐个字段获取值,可在这里添加特殊字段的处理逻辑
        record_dict[field] = self[field]
    print(record_dict)
    return True

这个方案适合你需要对某些字段做定制化处理的场景,比如把One2many字段转换成特定格式的列表。

注意事项

如果是在列表视图批量触发按钮,self是多条记录的集合,需要循环遍历每个记录处理:

def button_get_all_fields(self):
    for record in self:
        single_record_dict = record.read()[0]
        # 处理单条记录的字典
        print(single_record_dict)
    return True

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:15:00