odoo中的name_get详解
name_get
是Odoo框架中一个非常重要的方法。它用于定义在Odoo的用户界面上如何显示一个记录的名称。name_get
方法通常在许多地方使用,包括下拉选择框,一对多或多对多字段的值,或者任何需要显示模型记录名称的地方。
-
作用:
name_get
方法返回一个列表,每个列表元素是一个元组,其中包含记录的ID和显示的名称。默认情况下,name_get
方法返回模型中name
字段的值。但是在许多情况下,这并不足以唯一标识一个记录,或者提供足够的信息给用户。因此,经常需要对name_get
方法进行覆盖,以便在显示时提供更详细的信息。 -
底层原理:
name_get
方法在models.Model
基类中定义。它循环遍历记录集,为每个记录生成一个元组,包含记录的ID和显示的名称。显示的名称是通过调用display_name
字段的_compute_display_name
方法得到的。默认情况下,这个方法只是简单地返回name
字段的值。但是,可以通过在模型中定义_rec_name
属性为其他字段的名称来改变这个行为。 -
使用场景:
name_get
方法经常在那些需要显示模型记录名称的地方被使用。例如:- 在一个
many2one
字段的下拉选择框中,name_get
定义了每个选项的显示方式。 - 在一个
many2many
字段中,name_get
定义了每个选择的标签的显示方式。 - 在一个记录的Form视图中,Breadcrumbs导航中的记录名称就是通过
name_get
方法得到的。
- 在一个
-
例子:
下面是一个例子,演示了如何重写
name_get
方法:1 class ResPartner(models.Model): 2 _inherit = "res.partner" 3 4 def name_get(self): 5 result = [] 6 for record in self: 7 name = record.name 8 if record.city: 9 name = "%s, %s" % (name, record.city) 10 result.append((record.id, name)) 11 return result
在这个例子中,我们在合作伙伴的名称后面加上了他们所在的城市名。这样在用户界面上,每个合作伙伴的名称后面都会显示他们所在的城市,从而使用户更容易识别他们。