回顧學習
之前有講解過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%以上的問題。
- 有問題可以下方留言。
每日精進:慢慢建立自己的原則,做一個有原則的人。