表单序列号这个概念非常重要,是一张表单的表示符号。比如销售订单,它的典型的序列号如SO202004270001就能很清楚的标识出来。这一次我们就来讲如何做出我们自己的表单序列号。
我们要在om_hospital下面建立一个叫data的目录,这个属于标准化操作,忘记了的朋友请参考:02 创建新模块(学Odoo,就得Do ),里面对每个目录肩负的使命描述的很清楚。然后我们在data目录中新建xml文件ir_sequence_data.xml(我们对目录命名和文件命名都尽量往约定俗成的靠,方便维护和解读),对序列号的描述如下,非常容易理解:
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<!-- Sequences for hospital.patient -->
<record id="seq_hospital_patient" model="ir.sequence">
<field name="name">Patient Sequence</field>
<field name="code">hospital.patient.sequence</field>
<field name="prefix">HP</field>
<field name="padding">3</field>
<field name="company_id" eval="False"/>
</record>
</data>
</odoo>
随后我们要更新__manifest__.py的data区间,让Odoo能够识别出来我们新建立的sequence.xml
'data' : [
'security/ir.model.access.csv',
'data/ir_sequence_data.xml',
'views/patient_menu.xml'
],
接着我们要更新patient_menu.xml文件,让Odoo在表单界面上显示出来这个序列号
1. 把在patient.py的序列号字段(name_seq)在Tree View上,让其在列表页可见
<!-- Patient Tree -->
<record id="patient_tree" model="ir.ui.view">
<field name="name">hospital.patient.tree</field>
<field name="model">hospital.patient</field>
<field name="arch" type="xml">
<tree string="Patients">
<field name="name_seq"/>
<field name="patient_name"/>
<field name="patient_disp_name"/>
<field name="patient_age"/>
<field name="notes"/>
<field name="image"/>
</tree>
</field>
</record>
2. 在Form View上登记序列号字段
<sheet>
<div class="oe_title">
<h1>
<field name="name_seq" readonly="1"/>
</h1>
</div>
<group>
<group>
<field name="patient_name"/>
<field name="patient_disp_name"/>
</group>
<group>
<field name="patient_age"/>
</group>
<group>
<field name="notes"/>
<field name="image"/>
</group>
</group>
</sheet>
最后我们要实现一下序列号生成的标准接口(name_seq和def create),注意import要全
from odoo import models, fields, api, _
class HospitalPatient(models.Model):
_name = 'hospital.patient'
_inherit= ['mail.thread','mail.activity.mixin']
_description = 'Patient Record'
_rec_name = 'patient_disp_name'
patient_name = fields.Char(string='Name', required=True); # 必填字段
patient_age = fields.Integer(string='Age');
notes = fields.Text(string='Notes');
image = fields.Binary(string='Image');
patient_disp_name = fields.Char(string='Patient Display Name'); # patient在标题栏的显示信息
name_seq = fields.Char(string='Order Reference', required=True, copy=False, readonly=True,index=True, default=lambda self: _('New'))
@api.model
def create(self, vals):
if vals.get('name_seq', _('New')) == _('New'):
vals['name_seq'] = self.env['ir.sequence'].next_by_code('hospital.patient.sequence') or _('New')
result = super(HospitalPatient, self).create(vals)
return result
现在我们试一下效果。升级我们的模块,成功后看一下Settings
然后我们新建一个病人的数据
保存后,我们可以看到序列号生成了