odoo如何修改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%以上的問題。
  • 有問題可以下方留言。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM