odoo中的name_get详解

发布时间 2023-06-26 08:38:44作者: *感悟人生*

  name_get是Odoo框架中一个非常重要的方法。它用于定义在Odoo的用户界面上如何显示一个记录的名称。name_get方法通常在许多地方使用,包括下拉选择框,一对多或多对多字段的值,或者任何需要显示模型记录名称的地方。

  1. 作用:

    name_get方法返回一个列表,每个列表元素是一个元组,其中包含记录的ID和显示的名称。默认情况下,name_get方法返回模型中name字段的值。但是在许多情况下,这并不足以唯一标识一个记录,或者提供足够的信息给用户。因此,经常需要对name_get方法进行覆盖,以便在显示时提供更详细的信息。

  2. 底层原理:

    name_get方法在models.Model基类中定义。它循环遍历记录集,为每个记录生成一个元组,包含记录的ID和显示的名称。显示的名称是通过调用display_name字段的_compute_display_name方法得到的。默认情况下,这个方法只是简单地返回name字段的值。但是,可以通过在模型中定义_rec_name属性为其他字段的名称来改变这个行为。

  3. 使用场景:

    name_get方法经常在那些需要显示模型记录名称的地方被使用。例如:

    • 在一个many2one字段的下拉选择框中,name_get定义了每个选项的显示方式。
    • 在一个many2many字段中,name_get定义了每个选择的标签的显示方式。
    • 在一个记录的Form视图中,Breadcrumbs导航中的记录名称就是通过name_get方法得到的。
  4. 例子:

    下面是一个例子,演示了如何重写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

    在这个例子中,我们在合作伙伴的名称后面加上了他们所在的城市名。这样在用户界面上,每个合作伙伴的名称后面都会显示他们所在的城市,从而使用户更容易识别他们。