Odoo 10 - Api.multi 装饰不会循环到所有记录

Odoo 10 - Api.multi decoration doesn't loop to all records

我是在 Odoo 中从头开始创建模块的新手,我正在阅读这本书:Odoo 10 开发要点 - Daniel Reis。按照本书的步骤,我创建了这个简单的 class:

# coding: utf8
from odoo import models, fields, api


class TodoTask(models.Model):
    _name = 'todo.task'
    _description = 'to-do task'
    name = fields.Char('Description', required=True)
    is_done = fields.Boolean('Done?')
    active = fields.Boolean('Active?', default=True)


    @api.multi
    def do_toggle_button(self):
        for task in self:
            task.is_done = not task.is_done
        return True

接下来是 xml 视图文件:

<?xml version="1.0" encoding="UTF-8"?>
<odoo>
    <record id="view_form_todo_task" model="ir.ui.view">
        <field name="name">To-Do Task Form</field>
        <field name="model">todo.task</field>
        <field name="arch" type="xml">
            <form string="To-Do task">
                <header>
                    <button name="do_toggle_button" type="object" string="Toggle Done" class="oe_highlight"/>
                    <button name="do_clear_done" type="object" string="Clear All Done"/>
                </header>
                <sheet>
                    <group name="group_top">
                        <group name="group_left">
                            <field name="name"/>
                        </group>
                        <group name="group_right">
                            <field name="is_done"/>
                            <field name="active" readonly="1"/>
                        </group>
                    </group>
                </sheet>
            </form>
        </field>
    </record>
    <record id="view_tree_todo_task" model="ir.ui.view">
        <field name="name">To-Do Task Tree</field>
        <field name="model">todo.task</field>
        <field name="arch" type="xml">
            <tree string="To-Do task shown">
                <field name="name"/>
                <field name="is_done"/>
            </tree>
        </field>
    </record>
    <record id="view_search_todo_task" model="ir.ui.view">
        <field name="name">To-Do Task Search</field>
        <field name="model">todo.task</field>
        <field name="arch" type="xml">
            <search>
                <field name="name"/>
                <filter string="Not Done" domain="[('is_done','=',False)]"/>
                <filter string="Done" domain="[('is_done','!=',False)]"/>
            </search>
        </field>
    </record>
</odoo>

对于do_toggle_done方法,书上说:“代码循环遍历所有待办任务记录,并针对每个记录修改字段,反转其值。”这是因为对于 api.multi,如果我理解正确,对象 "self" 代表所有记录集,但是当我调用该函数(使用按钮)时,它只修改我正在修改的记录的标志其他保持不变。有什么问题吗?我是不是误会了?

由于您在表单视图上添加了多功能,因此您自己只会获得一条记录。 Self 代表一个数据集,但在表单视图中,该数据集只有一条记录。如果你想切换所有任务的完成状态,你可以使用一个向导来调用 @api.model 函数来查询所有任务并相应地处理它,或者使用 ir.server.action 喜欢

  <record id="ir_actions_server_timesheet_sheet" model="ir.actions.server">
        <field name="sequence" eval="5"/>
        <field name="state">code</field>
        <field name="type">ir.actions.server</field>
        <field name="model_id" ref="model_hr_timesheet_current_open"/>
        <field name="code">action = model.open_timesheet()</field>
        <field name="condition">True</field>
        <field name="name">My Timesheet</field>
    </record>