odoo12 修行基礎篇之 新增按鈕 (三)
這一篇耽擱了好久啊...
公司讓我去做Java專案了,寫了一堆springboot、vue的文章。
還好最近有點時間,又開始了odoo12專案維護,爭取能把這一系列完成吧。時間拖得有點長,著實有點生疏了。
長話短說,開始吧。
這回我們搞一個客戶投訴模組,演示一下,如何新增按鈕。
在models目錄新建檔案my_customer_complain.py,在init.py中引入。
1 # -*- coding:utf-8 -*- 2 3 from odoo import fields, models 4 5 6 class MyCustomerComplain(models.Model):7 _name = "my.customer.complain" 8 _description = '客戶投訴' 9 10 # 客戶 11 customer_id = fields.Many2one( 12 'res.partner', string='客戶', 13 domain=[('customer', '=', True), ('parent_id', '=', False)] 14 ) 15 16 # 供應商 17 supplier_id = fields.Many2one( 18 'res.partner', string='供應商', 19 domain=[('supplier', '=', True), ('parent_id', '=', False)] 20 ) 21 22 # 銷售訂單 23 order_id = fields.Many2one( 24 'sale.order', string='銷售訂單', 25 domain=[('state', '=', 'sale')] 26 ) 27 28 # 投訴內容 29 complains = fields.Text(string='投訴內容')
這裡在定義Many2one欄位時,用了domain屬性。Many2one欄位只會顯示符合欄位內容的記錄。其實就相當於定義了到資料庫查詢時的篩選條件,因此,domain中使用的欄位必須在對應的引用表中存在。
在views目錄中新建my_customer_complain.xml檔案,注意在__manifest__.py中引入。
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <odoo> 3 4 <!--在銷售報告欄增加客戶投訴按鈕--> 5 <act_window id="action_my_customer_complaint" 6 name="客戶投訴頁" 7 res_model="my.customer.complain" 8 /> 9 <menuitem 10 id="menu_my_customer_complaint" 11 name="客戶投訴" 12 action="action_my_customer_complaint" 13 parent="sale.menu_sale_report" 14 sequence="5" 15 /> 16 17 </odoo>
<act_window/>:
id: 定義標籤的唯一標識,不能重複(下面就不說了,一個意思)
name: 點選按鈕進入列表頁面顯示的標題
res_model: 對應的model類名(_name屬性)
<menuitem/>:
name: 按鈕名稱
action: 定義的act_window對應的id
parent: 按鈕的位置(下面再說下,如何獲取)
sequence: 順序,越大越靠後
如何檢視按鈕位置:
我是google瀏覽器。在要放置的按鈕上點選右鍵,找到最下面的檢查選項,在彈出的內容中,找到data-menu-xmlid選項的值,就是parent中要填的內容。
這個時候升級一下模組,你會發現,按鈕呢,竟然沒有...
這個坑當時坑了我好長時間。
其實就是許可權問題。
找到security中的ir.model.access.csv檔案,沒有的話就新建。
在__manifest__.py的data標籤中引入security/ir.model.access.csv
在檔案中增加以下內容:
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_my_customer_complain,my.customer.complain,model_my_customer_complain,,1,1,1,1
第一行是標題,第二行開始才是定義的內容,用逗號分隔
id:就是唯一標識,可以使用access_模組名_組名_許可權的命名方式來唯一標記。
name: 可以重複,但不建議
model_id: 必須與模組名對應一致,格式是model_(模組名,點用下劃線代替)
group_id: 組名,不填代表所有,可以指定許可權組,這個以後再說
後面四個分別為讀、寫、建立、刪除許可權,1代表有許可權,0代表沒有
這個時候再升級以下,發現按鈕出來了。
點選建立一個單子試試。
我們在form頁面中再加一個按鈕,目前沒有什麼作用。
在my_customer_complain.xml檔案中定義form表單,在form標籤中增加header標籤,並在其中定義按鈕button。
<!--form表單--> <record id="view_my_customer_complain" model="ir.ui.view"> <field name="name">view.my.customer.complain</field> <field name="model">my.customer.complain</field> <field name="arch" type="xml"> <form string="Customer Complain"> <header> <button name="action_cancel" string="取消" type="object" confirm="確認取消?"/> </header> <sheet> <group name="top"> <group name="top_left"> <field name="supplier_id"/> </group> <group name="top_right"> <field name="customer_id"/> <field name="order_id"/> </group> </group> <group name="body"> <field name="complains"/> </group> </sheet> </form> </field> </record>
<button/>:
type:這裡填object表示點選按鈕用來呼叫python的方法,呼叫的form對應的類中的方法。
name: 表示要呼叫的方法名。
string: 就是按鈕顯示的名字。
confirm: 表示按鈕點選後進行彈框提示,值是要提示的內容。
還有很多屬性,後面有機會再介紹,也可自行學習下。
在my_customer_complain.py檔案中加入按鈕定義的方法,方法名與button中的name屬性一致。
@api.multi def action_cancel(self): print(self)
點選後彈出提示框:
點選確認按鈕,可以看到列印的self就是對應的記錄。
可以對記錄進行操作了。
my.customer.complain(1,)
按鈕就簡單介紹到這吧,下一篇我們介紹下工作流的新增。