odoo——入门教程整理(三)

本文是根据网上的odoo教程整理出来的,具体内容为创建一个待办事项的odoo应用

参考资料:

  1. B站视频——odoo开发入门与精通
  2. Alan Hou的个人博客
    感谢大哥们的经验分享

本篇是对B站视频的第三讲整理。 主要内容:

  • 模型间多对一一对多的使用

 

建立代办事项的分类菜单

  通过建立一个分类来学习模型关联的使用,包括One2many1对多,以及many2one多对1。 首先我们在models.py中添加一个类TodoCategory,并为期设置一个name属性来表示名称

class TodoCategory(models.Model):
    _name = "todo.category"
    _description = "待办事项分类"

    name = fields.Char(string="分类", required=True)

接下来修改视图文件views/views.xml,让分类菜单可以显示出来

  • 首先添加两个ir.ui.view,分别对应分类的主页面以及点开以后的详情表单页,代码如下:
    <record model="ir.ui.view" id="todo_category_list">
      <field name="name">Todo Category List</field>
      <field name="model">todo.category</field>
      <field name="arch" type="xml">
        <tree>
          <field name="name"/>
        </tree>
      </field>
    </record>
    <record model="ir.ui.view" id="todo_category_form">
      <field name="name">Todo Category Form</field>
      <field name="model">todo.category</field>
      <field name="arch" type="xml">
        <form>
          <sheet>
            <group>
              <group>
                <field name="name"/>
              </group>
            </group>
          </sheet>
        </form>
      </field>
    </record>

接下来在添加menuitem用于显示分类菜单,我们把 category 目录放在 Todo Manager 分类下:

    <menuitem name="Todo Category" id="menu_todo_category_list" parent="menu_todo_manager"
              action="act_todo_category_win" />

然后添加idact_todo_category_win的action

    <record model="ir.actions.act_window" id="act_todo_category_win">
      <field name="name">Todo Category Window</field>
      <field name="res_model">todo.category</field>
      <field name="view_mode">tree,form</field>
    </record>

全部修改完毕后,注意在权限文件中加入category的权限,这里不涉及权限管理的讲解,所以直接复制task的权限设置

access_todo_category,todo.category,model_todo_category,,1,1,1,0

全部完成以后,重启odoo-bin,并更新todo模块,在Todo Manager 下面看到新增的 分类列表: category_menu category_info

为todo.task添加分类

  在models.py中为todo.task添加一个新的关联字段 category_id,1个分类可能有好多个待办事项,所以使用Many2one关联todo.category:

category_id = fields.Many2one('todo.category', string='类别')

models中加入字段以后,紧接着在views.xml添加field是哥好习惯,所以 分别在 todo_task_listtodo_task_form中添加下面的代码用于显示待办事项的类别。

<field name="category_id"/>

修改完以后重启 odoo-bin并更新模块,可以看到。待办列表中显示类别,并与 category 关联 category_1 category_2

为Category 添加功能

  到目前为止,分类菜单中还依然只显示一个name名称,我们先为todo_category_view添加一个统计字段,显示分类下的todo.task的总数。此时需要为category关联task类型,这里用One2many一对多关联。 为models.py添加代码

    task_ids = fields.One2many('todo.task', 'category_id', string='待办事项')
    task_count = fields.Char(string='总数', compute='_compute_task_count')

    @api.depends('task_ids')
    def _compute_task_count(self):
        for rec in self:
            rec.task_count = str(len(rec.task_ids))

修改视图文件,添加对应的field

    <record model="ir.ui.view" id="todo_category_list">
      <field name="name">Todo Category List</field>
      <field name="model">todo.category</field>
      <field name="arch" type="xml">
        <tree>
          <field name="name"/>
          <field name="task_count"/>
          <field name="task_ids" invisible="1" />
        </tree>
      </field>
    </record>
    <record model="ir.ui.view" id="todo_category_form">
      <field name="name">Todo Category Form</field>
      <field name="model">todo.category</field>
      <field name="arch" type="xml">
        <form>
          <sheet>
            <group>
              <group>
                <field name="name"/>
              </group>
              <group>
                <field name="task_count"/>
                <field name="task_ids" invisible="1" />
              </group>
            </group>
          </sheet>
        </form>
      </field>
    </record>

上面为修改后的完整的两个view代码,task_id不需要显示,所以用了invisible。task_count设置为char类型是为了方便左对其,integer默认靠右显示。同样重启odoo-bin后更新todo模块,得到如下的效果: category_view_1 category_form_1 为了阅读方便,我们希望在分类的详情页也可以显示详细的待办事项信息,所以在第一级的group节点下面添加一个notebook节点:

            <notebook>
              <page string="待办事项">
                <field name="task_ids">
                  <tree edit="0" create="0" delete="0">
                    <field name="name"/>
                    <field name="is_done"/>
                    <field name="priority" />
                    <field name="deadline" />
                    <field name="is_expired" />
                  </tree>
                </field>
              </page>
            </notebook>

修改xml文件不需要重启 odoo-bin,直接更新模块就可以查看效果 category_done