1. 程式人生 > 實用技巧 >odoo12 修行基礎篇之 新增按鈕 (三)

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,)

按鈕就簡單介紹到這吧,下一篇我們介紹下工作流的新增。