如何修改product.product的display_name的顯示,解決_rec_name失效的問題

回顧學習

之前有講解過display_name是怎麼由來的,odoo會去取_rec_name的值,會將_rec_name的值賦值給display_name。

class FandxProduct(model.Model):
  _inhert = "product.product"
  _rec_name = 'fandx_name'
  
  fandx_name = fields.Char(string='產品名稱')

這裏我們會發現_rec_name是無效的,之前我們也講解過需要重寫name_get才能會使用繼承後重寫的_rec_name

class FandxProduct(model.Model):
  _inhert = "product.product"
  _rec_name = 'fandx_name'
  
  fandx_name = fields.Char(string='產品名稱')
  
  def name_get(self):
    return super(GoodsSkus, self).name_get() 

這裏驚喜的發現display_name的取值還是name的值。既然如此那麼只能去在深入研究了display_name是怎麼來的了。

先研究一下Basemodel中display_name字段的由來

# display_name的取值決定與_compute_display_name的方法
# 1. _setup_base
# 2. _add_magic_fields
@api.model
def _add_magic_fields(self):
  # ....
  # 重點關注,display_name原來是根據compute計算字段而來的
  add('display_name', fields.Char(string='Display Name', automatic=True,
                                  compute='_compute_display_name'))
	#....	
          
@api.depends(lambda self: (self._rec_name,) if self._rec_name else ())
def _compute_display_name(self):
  names = dict(self.name_get())
  for record in self:
    record.display_name = names.get(record.id, False)

這麼一看沒有半點毛病,還是取值name_get(),那麼只有一種可能了name_get()被重寫了。

Product.product中的name_get()

查看了源碼果不其然,name_get的方法被重寫了,那麼久研究一下他爲什麼沒有走_rec_name


def name_get(self):
	# ....
  # 這裏發現,product直接取值product.name,並沒有取_rec_name,怪不得怎麼重寫rec_name都不會生效
  name = variant and "%s (%s)" % (product.name, variant) or product.name
  # ....

解決問題

Product的display_name爲什麼沒有取值_rec_name的原因是找到了,那麼對症下藥就可以了,還是重寫name_get(),但是返回的格式要注意name_get() -> [(id, name), ...]

class FandxProduct(model.Model):
  _inhert = "product.product"
  _rec_name = 'fandx_name'
  
  fandx_name = fields.Char(string='產品名稱')
  
  def name_get(self):
    # 這裏也可以根據自己的想法自由組建自己的display_name值的內容
    for record in self:
      name = record._rec_name
      add_data = (record.id, name)
      res.append(add_data)
    return res

總結

  • 其實說到底還是使用了name_get解決了問題,但是更加細緻的瞭解了display_name的由來。
  • 其實我們發現問題,耐心的去查看源碼基本可以解決90%以上的問題。
  • 有問題可以下方留言。

每日精進:慢慢建立自己的原則,做一個有原則的人。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章