首页 > 解决方案 > Odoo 10 - Api.multi 装饰不会循环到所有记录

问题描述

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

# 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”代表所有记录集,但是当我调用函数(使用按钮)时,它只修改我正在修改的记录的标志,其他的保留不变。有什么不对吗?我是不是误会了?

标签: pythonpython-3.xodoo-10

解决方案


由于您在表单视图中添加了多功能,因此您只会获得一条记录。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>

推荐阅读