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>
我是在 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>