今天練習了向《費用報銷系統》的《合同》視圖中增加<合同摘要>字段。

涉及到數據庫postgreSQL的操作,向數據表contrace_pact中增加字段<contrace_memo>、

向模型文件contrace_pact.py增加字段聲明:contrace_memo = fields.Char(string='合同摘要')  

向視圖文件contrace_pact_views.xml增寫必要的代碼。

今天解析了contrace_pact_views.xml視圖文件的重點代碼:

主要解析的代碼如下:

1、支付次數:

<field name="pay_time" attrs="{'readonly':[('contrace_type', '=', '2')],

                            'required':[('contrace_type', 'in', ['3','5'])],'invisible':[('contrace_type', '=', '2')]}"/>

註釋:

pay_time 是字段支付次數,其在視圖前端顯示時,取決於模型後端該字段的定義:

contrace_type = fields.Selection([('5','按次支付'),('2','按量支付'),('3','按次&按量')],string='合同類型',required=True)

attrs屬性解讀:

'readonly':[('contrace_type', '=', '2')]  是指當視圖前端選擇的合同類型為按量支付時(按量支付在後端的定義標識符為2),

該字段顯示為只讀;

'required':[('contrace_type', 'in', ['3','5'])]  是指當視圖前端選擇的合同類型為按次支付或按次&按量時(按次支付在後端的定義標識符為5,

按次&按量在後端的定義符為3),

該字段顯示為必填;

'invisible':[('contrace_type', '=', '2')]  是指當視圖前端選擇的合同類型為按量支付時(按量支付在後端的定義標識符為2),

該字段顯示為不顯示;

本句代碼實現的功能就是控制支付次數的顯示屬性,當用户在合同類型的下拉列表中選擇的值為按量支付時,下面的支付次數就隱藏了。

用於根據用户在視圖中某字段的操作結果來決定另一些字段是否顯示、是否只讀、是否必填。

類似的代碼例如:

模型端定義:

p_name = fields.Selection([('a', '張三'), ('b', '李四'), ('c', '王五')], string='姓名')

視圖端:

<field name="p_info" attrs="{'readonly':[('p_name', '=', 'c')],

                            'required':[('p_name', 'in', ['a','b'])],'invisible':[('p_name', '=', 'c')]}"/>


2、生成支付明細按鈕:

<button name="create_contrace_pact_ids" type="object" string="生成支付明細"

                                class="btn btn-primary oe_edit_only"

                                attrs="{'invisible':[('contrace_type', '=', '2')]}"/>

註釋:

按鈕<生成支付明細>是《費用報銷系統》中新增創建合同視圖中的一個重點功能,它根據<合同類型>來決定是否顯示、

根據<支付次數>來決定生成多少條支付明細記錄。

其在視圖前端顯示時,取決於模型後端<合同類型>的定義:

contrace_type = fields.Selection([('5','按次支付'),('2','按量支付'),('3','按次&按量')],string='合同類型',required=True)

attrs屬性解讀:

'invisible':[('contrace_type', '=', '2')]  是指當視圖前端選擇的合同類型為按量支付時(按量支付在後端的定義標識符為2),

該按鈕顯示為不顯示;

該按鈕的動作:

button name="create_contrace_pact_ids" 是調用模型後端的一個名叫<create_contrace_pact_ids>的方法,代碼:

def create_contrace_pact_ids(self):

        for rec in self:           

            if rec.pay_time > 0:

                values=[]

                for line in range(0,rec.pay_time):

                    value={'number':line+1,'contrace_type':rec.contrace_type,'contrace_memo':rec.contrace_memo,

                           'expire_date':rec.expire_date,'contrace_num':rec.contrace_num+'-'+str(line),

                           'contrace_name':'%s-%s'%(rec.contrace_name,line+1),'parent_id':rec.parent_id.id,'pay_time':1,

                           'contrace_pact_id':rec.id,'department_id':rec.department_id.id,'contrace_moneny':0,

                           'context':'第%s次支付,共支付%s次!!!' % (line+1,rec.pay_time)}

                    values.append(value)

                self.create(values)

            else:

                raise ValidationError(_('支付次數要大於0哦!!!%s'% rec.pay_time))

方法的主要代碼及功能:

'number':line+1  支付序號+1

'contrace_type':rec.contrace_type  合同類型直接取填寫的合同類型

'contrace_num':rec.contrace_num+'-'+str(line)  合同編號+循環值(起始值為0)

'contrace_name':'%s-%s'%(rec.contrace_name,line+1)  格式字符為中間加'-'連接符的合同名稱和循環值+1(起始值為0+1)

'parent_id':rec.parent_id.id  供應商名稱直接取所選的供應商名稱

'pay_time':1  支付次數默認取1

'contrace_moneny':0  合同金額默認取0

'context':'第%s次支付,共支付%s次!!!' % (line+1,rec.pay_time)  支付摘要包含支付總次數pay_time和當前序次(循環值+1)