当前位置:首页>python>中篇Python(ODOO)篇 第四章 ODOO项目优化部分(一)学员查询增强(二)车辆绑定模块增强

中篇Python(ODOO)篇 第四章 ODOO项目优化部分(一)学员查询增强(二)车辆绑定模块增强

  • 2026-10-11 07:32:15
中篇Python(ODOO)篇 第四章 ODOO项目优化部分(一)学员查询增强(二)车辆绑定模块增强

(一)学员查询增强

部分界面需要选择学员,开始学员不多的话,还能选择,随着业务的不断发展,学员会越来越多,通过列表查询方式已经不太实际,不过odoo数据过多的时候会出现搜索更多菜单项,点击进去可以看到学员搜索窗口,如有需要可以自定义搜索条件。

(二)车辆绑定模块增强

字段唯一性限制

车辆绑定子模块中,没有对车辆和教练唯一性绑定,一般情况,一个教练同时只能绑定一辆车,一辆车也只能绑定一个教练,我们可以用装饰器来检查,比较灵活。
@api.constrains('name')def _check_name(self):    count = self.search_count([('name', '=', self.name.id), ('active', '=', True)])    if count > 1:        raise exceptions.ValidationError("不允许同车辆编号")

也可以用数据库约束方式限制。

_sql_constraints = [('check_uniq_car_name', 'unique(name, active)',                     '该车已经绑定'),                    ('check_uniq_teacher_name', 'unique(teacher_name, active)',                     '该教练已经绑定')]
请注意,active的值,odoo仅检查为True的记录。

修改留痕

在实际应用中,有些字段不能随意改变,改变后需要记录是谁进行了修改,以方便后期追踪,我们以车辆绑定模块为例,做以下修改。
1、在__manifest__.py里面 depends继承模块需要添加对mail的依赖。
'depends': ['base','mail'],
1、在对应的车辆绑定模块的类(NebulaCarBind)通过_inherit继承minxin类。
_inherit = ['mail.thread','mail.activity.mixin']
2、在需要跟踪的字段添加track_visibility='onchange'属性,表示修改就记录。
bind_date = fields.Date('绑定日期',track_visibility='onchange')
4、改造该子模块对应的视图,在前显示跟踪字段,不能用默认的视图!
<divclass="oe_chatter">    <fieldname="message_follower_ids"widget="mail_followers"/>    <fieldname="activity_ids"widget="mail_activity"/>    <fieldname="message_ids"widget="mail_thread"/></div>
截图如下:

__manifest__.py

代码:

car_bind.py

from odoo import fields, models, api, exceptionsclass NebulaCarBind(models.Model):    _name = "nebula.car.bind"    _description = "车辆绑定"    _order = 'name'    _inherit = ['mail.thread', 'mail.activity.mixin']    # 集成消息模型 增加消息记录通知功能    active = fields.Boolean('是否有效', default=True, track_visibility='onchange')    name = fields.Many2one('nebula.car', string='车辆编号', index=True,                           size=8, copy=False, track_visibility='onchange',                           domain=[('active', '=', True)])    license_plate = fields.Char('车辆牌照', related='name.license_plate',                                store=True)    teacher_name = fields.Many2one('nebula.teacher', string='教练编号',                                   index=True, size=8, copy=False,                                   track_visibility='onchange',                                   domain=[('active', '=', True)])    teacher_full_name = fields.Char('教练姓名', related='teacher_name.full_name',                                    store=True)    bind_date = fields.Date('绑定日期', track_visibility='onchange',                            default=fields.Datetime.now)    unbind_date = fields.Date('解绑日期', track_visibility='onchange')    date_docket = fields.Datetime('单据日期', required=True, readonly=True,                                  index=True, default=fields.Datetime.now)    user_id = fields.Many2one('res.users', string='创建人', index=True,                              readonly=True, default=lambda self: self.env.user)    note = fields.Text('备注', track_visibility='onchange')    _sql_constraints = [('check_uniq_car_name', 'unique(name, active)',                         '该车已经绑定'),                        ('check_uniq_teacher_name', 'unique(teacher_name, active)',                         '该教练已经绑定')]    '''@api.constrains('name')    def _check_name(self):        print('self.name.id:', self.name.id)        count = self.search_count([('name', '=', self.name.id), ('active', '=', True)])        if count > 1:            raise exceptions.ValidationError("不允许同车辆编号")   '''

car_bind_view.xml

<?xml version="1.0" encoding="utf-8"?><odoo>    <data>        <recordmodel="ir.ui.view"id="peijia.form_car_bind_views">            <fieldname="name">peijia.car.bind.form</field>            <fieldname="model">nebula.car.bind</field>            <fieldname="arch"type="xml">                <formstring="表单">                    <sheet>                        <divclass="oe_button_box"name="button_box"/>                        <groupname="group_top">                            <groupname="group_left">                                <fieldname="name"/>                                <fieldname="teacher_name"/>                                <fieldname="active"/>                                <fieldname="bind_date"/>                            </group>                            <groupname="group_right">                                <fieldname="license_plate"/>                                <fieldname="teacher_full_name"/>                                <fieldname="unbind_date"/>                                <fieldname="user_id"/>                                <fieldname="date_docket"/>                            </group>                            <fieldname="note"/>                        </group>                    </sheet>                    <divclass="oe_chatter">                        <fieldname="message_follower_ids"widget="mail_followers"/>                        <fieldname="activity_ids"widget="mail_activity"/>                        <fieldname="message_ids"widget="mail_thread"/>                    </div>                </form>            </field>        </record>        <recordmodel="ir.ui.view"id="peijia.search_car_bind_views">            <fieldname="name">peijia.car.bind.search</field>            <fieldname="model">nebula.car.bind</field>            <fieldname="arch"type="xml">                <search>                    <fieldname="name"/>                    <fieldname="license_plate"/>                    <fieldname="teacher_name"/>                    <fieldname="teacher_full_name"/>                </search>            </field>        </record>        <recordmodel="ir.ui.view"id="peijia.tree_car_bind_views">            <fieldname="name">peijia.car.type.tree</field>            <fieldname="model">nebula.car.bind</field>            <fieldname="priority">1</field>            <fieldname="arch"type="xml">                <treestring="列表">                    <fieldname="active"/>                    <fieldname="name"/>                    <fieldname="license_plate"/>                    <fieldname="teacher_name"/>                    <fieldname="teacher_full_name"/>                    <fieldname="bind_date"/>                    <fieldname="unbind_date"/>                </tree>            </field>        </record>        <recordmodel="ir.actions.act_window"id="peijia.action_car_bind_views">            <fieldname="name">车辆绑定</field>            <fieldname="res_model">nebula.car.bind</field>            <fieldname="view_mode">tree,form</field>        </record>    </data></odoo>
界面展示:

最新文章

随机文章