附件上傳基本原理實現,可以參考這篇:
https://www.cnblogs.com/ljwTiey/p/7348291.html
http://blog.csdn.net/wangnan537/article/details/41903159
首先我們看一下odoo界面默認的附件功能,有木有感覺不是很友好!囧 :)
下面給小伙伴們介紹另一種odoo自帶的附件管理方式!
首先,在你的模型中增加如下定義:
############################################################################################################### # 增加附件上傳功能 attachment_number = fields.Integer(compute='_compute_attachment_number', string='Number of Attachments') @api.multi def _compute_attachment_number(self): """附件上傳""" attachment_data = self.env['ir.attachment'].read_group([('res_model', '=', '替換成你的模型名'), ('res_id', 'in', self.ids)], ['res_id'], ['res_id']) attachment = dict((data['res_id'], data['res_id_count']) for data in attachment_data) for expense in self: expense.attachment_number = attachment.get(expense.id, 0) @api.multi def action_get_attachment_view(self): """附件上傳動作視圖""" self.ensure_one() res = self.env['ir.actions.act_window'].for_xml_id('base', 'action_attachment') res['domain'] = [('res_model', '=', '替換成你的模型名'), ('res_id', 'in', self.ids)] res['context'] = {'default_res_model': '替換成你的模型名', 'default_res_id': self.id} return res #############################################################################################
前端view視圖增加如下代碼:
<div class="oe_button_box" name="button_box"> <button name="action_get_attachment_view" class="oe_stat_button" icon="fa-book" type="object"> <field name="attachment_number" widget="statinfo" string="附件上傳"/> </button> </div>
實現效果:
注意上方這個上傳界面,odoo做了權限配置,在開發者模式下,和普通模式下,顯示的界面是不同的。
激活開發者模式,該界面顯示效果:
這里其實是在視圖view前端代碼字段中增加了如下設置:
小伙伴們試試吧!!!
ps: 另外,注意一下,odoo附件模型屬於底層模型,當服務啟動時候,就會加載附件模型數據結構;因此,當你自定義了一個新模塊A,擴展了附件的字段,沒問題,可以正常安裝,也可以正常使用!
但是,但是!如果該新模塊A使用了一段時間后,假如你還想在該模塊A基礎上繼續擴展附件字段!
對不起,這個時候,擴展后,重啟odoo服務會報錯,提示相關附件,找不到你擴展的那個字段。
就是由於,服務啟動的時候,附件模型py數據結構文件就會被加載,但是真正的此時數據庫中還沒有生成相應的字段,所以會報錯。
而我們自己開發的模塊在模型字段擴展后,為什么沒有這個問題呢?
這是因為,我們普通模塊模型修改后,同樣在odoo服務重啟后,模型py文件會被加載,但是,我們可以進入應用列表,找到該模塊,點擊升級,數據庫中就會生成新的表結構。
結論:我們在擴展odoo底層自帶模塊模型字段的時候,要么一次定義好,要么使用一段時間后還想擴展,那么可以重新編寫個單獨的模塊來擴展。