原文地址:http://www.cnblogs.com/ygj0930/p/7144502.html
1:active字段為False的記錄如何顯示:
odoo中默認,active字段為False的記錄上不顯示的。但是如果在創建時沒有勾選active,之后想要顯示它,那就需要吧active修改為True。
然而它現在是不可見的,怎么修改?
通過odoo提供的搜索視圖來實現:
自定義篩選——active字段——為假
即可把active為False的記錄顯示出來,點擊它進行編輯,修改active為True即可。
2:添加了唯一性約束的字段,如何復制記錄?
如果為模型的字段添加了唯一性約束,那么在記錄的form視圖功能菜單上選擇“復制”時就會報錯。
那么我們要在維持唯一性的前提下,保留復制功能,則只能重寫模型的copy方法,在方法中為有唯一性約束的字段添加辨別性內容,使得紀錄可以被成功復制(當然,新紀錄中唯一性約束的字段時修改后的值,仍然唯一)
def copy(self, default=None):
default = dict(default or {})
#統計數據庫中已有多少個本紀錄的副本
copied_count = self.search_count(
[('字段', '=like', u"Copy of {}%".format(self.字段))])
#為副本中的字段值添加尾部修飾,維持唯一性
#第一次復制:cpoy of 原字段值
if not copied_count:
new_字段 = u"Copy of {}".format(self.字段)
#第n次復制:copy of 原字段值(次數)
else:
new_字段 = u"Copy of {} ({})".format(self.name, copied_count)
#調用父類復制函數,並把新默認值傳入
default['字段名'] = new_字段
return super(類名, self).copy(default)
3:想根據某字段不同值而進行不同顯示,但有不需要顯示該字段值,怎么辦?
在視圖標簽中包含這個field(包含這個字段才可以使用該字段),但其invisible屬性設置為1,即:該字段不可見。
<field name="字段" invisible="1"/>
4:逆運算
當通過compute屬性指定方法,根據依賴值計算得到當前字段值時。一般也要制定這個計算的逆運算——根據當前字段值,改變依賴值。
比如:開始日期+持續時間=結束日期,我們有這個可以得到結束日期。
如果用戶指定了開始日期和結束日期,那么持續時間=介紹日期-開始日期,實現這個邏輯的方法就是inverse屬性值指向的方法。
#定義結束日期字段,結束日期由開始+持續,而設置結束日期,則需要自行計算出持續日期
end_date = fields.Date(string="End Date", store=True,
compute='_get_end_date', inverse='_set_end_date')
#"獲取結束日期"事件的響應函數:計算出結束日期
@api.depends('start_date', 'duration')
def _get_end_date(self):
for r in self:
if not (r.start_date and r.duration):
r.end_date = r.start_date
continue
start = fields.Datetime.from_string(r.start_date)
duration = timedelta(days=r.duration, seconds=-1)
r.end_date = start + duration
#"設置結束日期"事件的響應函數:計算並設置持續時間
def _set_end_date(self):
for r in self:
if not (r.start_date and r.end_date):
continue
start_date = fields.Datetime.from_string(r.start_date)
end_date = fields.Datetime.from_string(r.end_date)
r.duration = (end_date - start_date).days + 1
5:odoo圖片顯示
odoo沒有專門的圖片標簽,但是可以通過widget來控制field標簽來顯示圖片內容。
圖片的內容保存在Binary類型的字段中,然后在視圖文件中通過以下語句顯示出來:
<field name="Img字段" widget="image" class="oe_avatar oe_left"/>
6:Odoo中數據保存的流程
在新建一條記錄,點擊“保存”按鈕后,會把該條記錄保存到數據庫中。
有時候,我們會對模型記錄進行約束,比如:與其他記錄比較某字段值,不能相同或者范圍重疊等。
此時,會遇到一個問題:新增記錄會與自己進行比較。
很多人對約束的理解為:新建一條記錄,點擊“保存”時進行約束檢查,如果不符合要求則拋出異常,記錄生成失敗。
然而,真正的流程應該是:內存中生成了模型記錄——嘗試插入表——約束檢查——檢測到異常,插入失敗。
約束,是在記錄生成之后,插入數據表之前進行的判斷,約束不能阻止記錄的生成。我們可以在代碼中,通過環境上下文訪問到新生成的記錄!
因此,如果在約束函數中將新記錄與數據庫中查找記錄進行比較時,切記要增加一個判斷條件:新記錄id!=數據庫中記錄id,避免自己與自己比較。