1. 程式人生 > >odoo使用筆記

odoo使用筆記

筆記 有時 避免 lse img 之前 pie format copy

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,避免自己與自己比較。

odoo使用筆記