引言
课前准备
- 学员准备:能访问互联网的电脑,可安装应用程序
- 教学材料:课件、讲义、案例、视频等教学材料,后续更新至该链接
- 课题纪律:培训签到及随堂作业完成情况,工作群通报
Odoo开发课程
课程目标
- 按照开发规范,修改demo模块
- 完成部门、员工表定义
- 实现多表集成交互
目录结构

动态字段-many2one
demo_department.py修改
department_id = fields.Many2one('demo.department', string="部门")
动态字段-one2many
demo_employee.py修改
employee_ids = fields.One2many('demo.employee', 'department_id', string="员工")
动态字段-many2many
demo_employee.py修改
teacher_ids = fields.Many2many('res.users', string="老师")
在views.xml修改
<field name="teacher_ids" widget="many2many_avatar_user"/>
<field name="teacher_ids" widget="many2many_avatar_user" options="{'no_create': True}"/>
widget选项
默认不需要widget,特殊字段样式使用widget样式
| 选项 | 作用 | 适用场景 |
|---|---|---|
| text | 多行文本输入框 | 长文本内容,如描述、备注 |
| html | HTML 编辑器 | 富文本内容,支持格式设置 |
| password | 密码输入框 | 密码字段,输入时显示为圆点 |
| 邮箱输入框 | 邮箱地址,提供格式验证 | |
| url | URL 输入框 | 网址链接,提供格式验证 |
| selection | 下拉选择框 | 预定义选项的字段 |
| many2one | 多对一选择器 | 关联其他模型的记录,如客户、产品 |
| many2many_tags | 标签式多选 | 多对多关系,如标签、分类 |
| one2many_list | 内嵌列表 | 一对多关系,如订单行、发票行 |
| radio | 单选按钮组 | 多个互斥选项,如维护类型 |
| checkbox | 复选框 | 布尔字段,如是否活跃、是否重复 |
| statusbar | 状态条 | 工作流阶段,如维护请求的状态 |
| progressbar | 进度条 | 任务完成百分比,如项目进度 |
| kanban_state_selection | 看板状态选择器 | 看板卡片的状态,如就绪、阻塞 |
| priority | 优先级指示器 | 任务优先级,如高、中、低 |
| many2one_avatar_user | 带头像的用户选择器 | 负责人、创建人等用户字段 |
| many2one_reference | 动态引用选择器 | 引用不同模型的记录 |
| reference | 引用字段 | 类似 many2one_reference,用于动态模型引用 |
| datetime | 日期时间选择器 | 包含日期和时间的字段 |
| date | 日期选择器 | 只包含日期的字段 |
| float_time | 时间输入框 | 小时和分钟,如持续时间 |
| monetary | 货币输入框 | 金额字段,显示货币符号 |
| float_ratio | 比率输入框 | 百分比或比率值 |
| integer | 整数输入框 | 整数数值,如数量、年龄 |
| float | 浮点数输入框 | 小数数值,如重量、长度 |
| binary | 文件上传组件 | 附件、图片等二进制文件 |
| image | 图片预览组件 | 产品图片、头像等 |
| pdf_viewer | PDF 查看器 | PDF 文档预览,如说明书 |
| embed_viewer | 嵌入内容查看器 | 外部链接嵌入,如 Google Slide |
| kanban_activity | 看板活动指示器 | 显示记录的活动状态 |
| activity_exception | 活动异常指示器 | 显示活动异常状态 |
| statinfo | 统计信息显示 | 只读的统计数据,如计数、总和 |
| state_selection | 状态选择器 |
关联调用
在demo_employee_views.xml修改
<header>
<button name="action_open_department" type="object" string="打开部门" class="btn-primary"/>
</header>
def action_open_department(self):
self.ensure_one()
return {
'type': 'ir.actions.act_window',
'name': '部门',
'res_model': 'demo.department',
'view_mode': 'form',
'res_id': self.department_id.id,
}
<div class="oe_button_box" name="button_box">
<button name="action_open_department" type="object" class="oe_stat_button" string="打开部门" icon="fa-wrench"/>
</div>
在demo_department_views.xml修改
<div class="oe_button_box" name="button_box" invisible="not id">
<button class="oe_stat_button" type="object" name="action_open_employee" icon="fa-users">
<field string="员工" name="total_employee" widget="statinfo"/>
</button>
</div>
def action_open_employee(self):
self.ensure_one()
return {
'type': 'ir.actions.act_window',
'name': '员工',
'res_model': 'demo.employee',
'view_mode': 'tree,form',
'domain': [('department_id', '=', self.id)],
'context': {'default_department_id': self.id,
'default_value': 150},
}
定义方法
<record model="ir.actions.act_window" id="demo.action_window">
<field name="name">备件维护</field>
<field name="res_model">demo.demo</field>
<field name="view_mode">tree,form,calendar,graph,pivot</field>
</record>
增加视图
日历视图
<record model="ir.ui.view" id="demo_employee_calendar">
<field name="name">员工日历</field>
<field name="model">demo.employee</field>
<field name="arch" type="xml">
<calendar string="员工生日日历" date_start="birthday" color="department_id" mode="month">
<field name="name" string="姓名"/>
<field name="age"/>
<field name="department_id"/>
<field name="code"/>
</calendar>
</field>
</record>
图表视图
<record model="ir.ui.view" id="demo_employee_graph">
<field name="name">员工图表</field>
<field name="model">demo.employee</field>
<field name="arch" type="xml">
<graph string="员工统计图表" type="bar">
<field name="department_id"/>
<field name="age" type="measure"/>
</graph>
</field>
</record>
透视视图
<record model="ir.ui.view" id="demo_employee_pivot">
<field name="name">员工透视图</field>
<field name="model">demo.employee</field>
<field name="arch" type="xml">
<pivot string="员工透视图">
<field name="department_id" type="row"/>
<field name="sex" type="col"/>
<field name="age" type="measure"/>
<field name="value" type="measure"/>
</pivot>
</field>
</record>
定义窗口动作
<record model="ir.actions.act_window" id="demo_employee_action_window">
<field name="name">员工</field>
<field name="res_model">demo.employee</field>
<field name="view_mode">tree,form,calendar,graph,pivot</field>
</record>
最终代码
参考:demo.zip
评论区