当前位置:首页>python>中篇Python(ODOO)篇 第三章 ODOO项目开发(三)添加基础部分模块 5.车辆管理

中篇Python(ODOO)篇 第三章 ODOO项目开发(三)添加基础部分模块 5.车辆管理

  • 2026-09-02 18:50:40
中篇Python(ODOO)篇 第三章 ODOO项目开发(三)添加基础部分模块 5.车辆管理
原始需求:

车辆编号:

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>

界面展示

列表效果:
表单效果:
留作业:复制功能有问题,请参考之前解决方法处理。

最新文章

随机文章