车辆编号: | 001 | 是否启用 | 是 | 牌照: | 沪A7868 | 车型: | 现代伊兰特 |
排档类: | 手动档 | 发动机号: | G4GB2232 | 车辆识别代码: | LBEFEREDFA2 |
下次验证日期: | 2020/1/11 | 下次保养里程数(公里): | 610000 |
注册登记日期: | 2019/2/3 | 发证日期: | 2019/3/2 |
新增数据模型
models目录新建car.py数据模型文件,代码如下:# -*- coding: utf-8 -*-from odoo import fields, models, api, exceptionsclass NebulaCar(models.Model): _name = "nebula.car" _description = "车辆管理" _order = 'name' active = fields.Boolean(default=True, string='是否启用') name = fields.Char('车辆编号', size=8, required=True, index=True, default='未编号') auto_type_name = fields.Selection(selection='_select_auto_type', string='排挡类') license_plate = fields.Char('车辆牌照', size=10, copy=False) engine_number = fields.Char('发动机号', size=10, copy=False) vin = fields.Char('车架号', size=20, copy=False) register_date = fields.Date('注册日期') issue_date = fields.Date('发证日期') next_maintain = fields.Integer('下次保养里程数', default=7500) next_verify = fields.Date('下次验证日期') note = fields.Text('备注') @api.model def _select_car_type(self): records = self.env['nebula.car.type'].search([('active', '=', True)]) return [(r.name, r.name_type) for r in records] def _select_auto_type(self): records = self.env['nebula.auto.type'].search([]) return [(r.name, r.name_type) for r in records] car_type_name = fields.Selection(selection='_select_car_type', string='车型') @api.constrains('name') def _check_name(self): count = self.search_count([('name', '=', self.name)]) if count > 1: raise exceptions.ValidationError("不允许同车辆编号")
将该文件名(car)添加到models目录下__init__.py的auto_type后面,前面以逗号分割,如下所示。from . import car_type, auto_type, metier_type, driving_licence_type, car
Selection字段是枚举类型,需要返回下拉选项列表,使用_select_auto_type装饰器函数返回一个下拉选项列表。records =self.env['nebula.car.type'].search([('active','=',True)]),意思是在车辆类型数据(nebula.car.type)中筛选出active=true条件的记录集。return[(r.name, r.name_type)forrinrecords],意思是循环记录集返回一个列表。@api.constrains('name')是一个对字段进行限制检查的装饰器,检查name的值。_check_name(self)是检查函数,该函数功能是查找这个数据库中name字段的值和要存入的name的值相同的有多少个,如果大于1,就有重复,则抛出异常,使数据不能存入,等待修改或下一步处理。这个方法相对之前检查重名方法比较,是可以添加更多处理条件和步骤的。
设置访问权限
在security目录下的ir.model.access.csv新增一行权限记录。access_nebula_car,nebula.car,model_nebula_car,group_peijia_manager,1,1,1,1
创建视图层
在views目录新增car_list_views.xml文件,先用默认方式展示即可,待模块加载成功后再逐步修改和完善文件,这是一个良好的习惯,内容如下:<?xml version="1.0" encoding="utf-8"?><odoo> <act_windowid="peijia.action_car_views"name="车辆管理" res_model="nebula.car" view_mode="tree,form" /></odoo>
修改peijia目录下__manifest__.py文件中data段,在views/car_type_views.xml前新增views/car_list_views.xml文件名。在views目录下car_views.xml文件,前添加菜单指向车辆列表子模块,代码:<menuitem id="menu_car_list_views" name ="车辆管理" parent="menu_peijia_base_data" sequence="100" action="peijia.action_car_views"/>
重启后,更新陪驾模块,查看是否已经有相关菜单和界面。正常后继续修改视图层。完善视图层
将car_list_views.xml文件中act_window段删除,修改如下:<?xml version="1.0" encoding="utf-8"?><odoo> <data> <recordmodel="ir.ui.view"id="peijia.form_car_views"> <fieldname="name">peijia.car.form</field> <fieldname="model">nebula.car</field> <fieldname="arch"type="xml"> <formstring="表单"> <sheet> <divclass="oe_button_box"name="button_box"/> <groupname="group_top"> <groupname="group_left"> <fieldname="name"/> <fieldname="active"/> <fieldname="license_plate"/> <fieldname="car_type_name"/> <fieldname="auto_type_name"/> </group> <groupname="group_right"> <fieldname="engine_number"/> <fieldname="vin"/> <fieldname="register_date"/> <fieldname="issue_date"/> <fieldname="next_maintain"/> <fieldname="next_verify"/> </group> <fieldname="note"/> </group> </sheet> </form> </field> </record> <recordmodel="ir.ui.view"id="peijia.search_car_views"> <fieldname="name">peijia.car.search</field> <fieldname="model">nebula.car</field> <fieldname="arch"type="xml"> <search> <fieldname="name"/> <fieldname="license_plate"/> <fieldname="auto_type_name"/> </search> </field> </record> <recordmodel="ir.ui.view"id="peijia.tree_car_views"> <fieldname="name">peijia.car.tree</field> <fieldname="model">nebula.car</field> <fieldname="priority">1</field> <fieldname="arch"type="xml"> <treestring="列表"> <fieldname="active"/> <fieldname="name"/> <fieldname="license_plate"/> <fieldname="car_type_name"/> <fieldname="auto_type_name"/> <fieldname="car_type_name"/> </tree> </field> </record> <recordmodel="ir.actions.act_window"id="peijia.action_car_views"> <fieldname="name">车辆管理</field> <fieldname="res_model">nebula.car</field> <fieldname="view_mode">tree,form</field> </record> </data></odoo>
界面展示