上面两个图是创建用户后自动生成的,字段为code,且当前设置为不可编辑
那么它是如何实现的?
首先创建字段
code = fields.Char(string='员工编号', readonly=1)
这一字段创建后,为该字段写一个方法
#文件头部先导包
from odoo import fields, api, models
@api.model
def create(self, values):
if not values.get('code'):
values['code'] = self.env['ir.sequence'].next_by_code('hr_employee_pro_data_worker_id')
return super(HrEmployeePro, self).create(values)
这里的next_by_code方法将自动计数,里面的参数是从data文件中传过来的
在模块文件夹中新建data文件夹以存放data文件
然后在里面新建一个xml文件hr_xxxx_data.xml
并按如下代码写入
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<data noupdate="1">
<record id="hr_employee_pro_data_id_make" model="ir.sequence">
<field name="name">基础信息工号生成</field>
<field name="code">hr_employee_pro_data_worker_id</field>
<field name="prefix">%(year)s%(month)s%(day)s</field>
<field name="padding">3</field>
</record>
</data>
</odoo>
ir.sequence是odoo原生提供的一个很好用的序列号生成器
这里code参数与上面刚刚写的方法的那个next_by_code方法的参数值一致,如果涉及到跨模型的情况推荐将“_”变成“.”,并尽可能简化命名词量或以“模型.id”的形式以确保可以关联上对应的方法。
padding是指在prefix格式生成的序列号后加几位的序号,这里设置是3位,所以默认从001开始。
注意id不要与其他id重复,最好的方法就是模块名+自定义名,这样也便于源码阅读时的可读性,可以增强团队合作的效率和幸福度。
prefix格式odoo官方也提供了,在设置-技术-序号中可以查看到,可以参考使用
最后注意不要忘记在__manifest__.py文件中注册该xml的data文件
'data': [
'security/ir.model.access.csv',
'data/hr_xxxx_data.xml',
'views/视图.xml',
],
这里需要注意位置,odoo非常讲究先后顺序,错误的顺序将直接导致启用新库时出现文件丢失的报错。
最后升级或安装模块,然后就可看到效果。
上面说到,padding是默认从001开始,可以在开发者模式下进入设置-技术-序号中查看,下面展示我这一演示模型的序号页面
若期望下一自动生成的员工编号从5开始,则在“下一号码”处修改为5即可。
可以看到修改后保存,返回员工界面后新建一个员工“张三”,他的员工编号已经从005开始了。
本篇涉及的技术感谢我的同事璐哥的帮助。