08 生成表单序列号(学Odoo,就得Do)

表单序列号这个概念非常重要,是一张表单的表示符号。比如销售订单,它的典型的序列号如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

然后我们新建一个病人的数据

保存后,我们可以看到序列号生成了

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值