目 录CONTENT

文章目录

三、多表交互及页面优化

胡彬
2024-05-30 / 0 评论 / 1 点赞 / 1,563 阅读 / 1,626 字

引言

课前准备

  1. 学员准备:能访问互联网的电脑,可安装应用程序
  2. 教学材料:课件、讲义、案例、视频等教学材料,后续更新至该链接
  3. 课题纪律:培训签到及随堂作业完成情况,工作群通报

Odoo开发课程

课程目标

  1. 按照开发规范,修改demo模块
  2. 完成部门、员工表定义
  3. 实现多表集成交互

目录结构

image-1768793901513

动态字段-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 密码输入框 密码字段,输入时显示为圆点
email 邮箱输入框 邮箱地址,提供格式验证
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

1

评论区