python - 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”代表所有记录集,但是当我调用函数(使用按钮)时,它只修改我正在修改的记录的标志,其他的保留不变。有什么不对吗?我是不是误会了?
解决方案
由于您在表单视图中添加了多功能,因此您只会获得一条记录。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>
推荐阅读
- docker - 支持最多架构的 Docker 基础镜像?
- file-upload - 使用浏览器文件选择器对话框在 Emscripten 中打开文件
- python - 使用 Python 在 Selenium 中等待 elementID 或简单警报
- firebase - 使用 Fragments 作为登录用户实例是否有一些缺点?
- r - 使用 dplyr 更改 R 中的行序列
- python - 如何在 R 或 python 中绘制时间序列上的聚集水平条形图
- php - 如何从单行的多个列中获取值?
- c# - .NET 5 TLS 意外的 EOF
- python - 将 2D numpy 数组中的元素更改为 nan
- json - 各方之间数据交换的 JSON 模式设计建议