Odoo 8 - 从 python 方法启动 ir.actions.act_window?
Odoo 8 - Launch a ir.actions.act_window from a python method?
是否可以从模型的 Python 方法启动 ir.actions.act_window?。
例如,我实现了一个代表课程会话的会话模型(我也有一个课程模型)。
另外,我有一个 openacademy.xml,我在其中定义了表单视图以打开会话表单视图。
<record model="ir.ui.view" id="session_form_view">
<field name="name">session.form</field>
<field name="model">openacademy.session</field>
<field name="arch" type="xml">
<form>
<header>
<button name="draft" type="workflow"
string="Reset to draft"
states="confirmed,done"/>
<button name="confirm" type="workflow"
string="Confirm" states="draft"
class="oe_highlight"/>
<button name="done" type="workflow"
string="Mark as done" states="confirmed"
class="oe_highlight"/>
<button type="object"
name="my_method"
string="New course"/>
<field name="state" widget="statusbar"/>
</header>
<sheet>
<group string="General">
<field name="name" string="Session name"/>
<field name="course_id" string="Course"/>
<field name="instructor_id" string="Instructor"/>
</group>
<group string="Management">
<field name="start_date" string="Start date"/>
<field name="active" string="Active"/>
<field name="duration" string="Duration (in days)"/>
<field name="seats"/>
<field name="percent_taken_seats" widget="progressbar"/>
</group>
<label for="attendees"/>
<field name="attendees"/>
</sheet>
</form>
</field>
</record>
上述代码的相关部分如下:
<button type="object" name="my_method" string="New course"/>
当我单击此按钮时,将调用会话模型(class 会话)中的方法 'my_method'。
class Session(models.Model):
...
@api.one
def my_method(self):
return {
'type': 'ir.actions.act_window',
'res_model': 'openacademy.course',
'view_type': 'form',
'view_mode': 'form',
'target': 'new',
}
此方法 return 包含 window 操作的不同键和值的字典,但它在 Odoo 8 中不起作用。
当我点击按钮 "New course" 时,my_method 被执行但课程表单视图没有打开以创建新的课程记录。
我不知道是否可以在 Odoo 版本 8 中执行此操作,或者 my_method 是否必须 return 更多内容。
尝试使用@api.multi
我编写了 return 一个 window 动作的函数。
与您的代码的唯一区别是我的装饰器。
否则,在你的函数中使用打印作为调试
确保它被调用的工具
装饰器有问题@api.one
。一个装饰器将方法的结果包装成一个像这样的字典:
{res_id: result}
这意味着在你的情况下,你实际上 returning
{res_id: act_window}
或者在数组中直接调用:
[act_window]
不幸的是,odoo 期望自己得到结果(在某个时候会得到 returned 的实际结果)。
在你的情况下,你应该改用这个:
@api.multi
def my_method(self):
self.ensure_one()
return {
'type': 'ir.actions.act_window',
'res_model': 'openacademy.course',
'view_type': 'form',
'view_mode': 'form',
'target': 'new',
}
self.ensure_one
在这种情况下并不是特别必要,但真正重要的是使用 @api.multi
。它不会将结果包装在任何东西中,并且 return 与您 return 完全不同 api.one
。
就我个人而言,我更喜欢使用 api.multi
,因为 api.multi
在任何情况下都能保持整洁。当我开始使用 @api.one
时,我在很多地方都遇到了这样的事情:
val = self._compute_something()[0]
你必须在其中获取第一个元素,因为 odoo 将它包装到一个列表中......而 @api.multi
更灵活,如果你真的想强制使用一个元素调用它,你可以随时使用ensure_one
。
是否可以从模型的 Python 方法启动 ir.actions.act_window?。 例如,我实现了一个代表课程会话的会话模型(我也有一个课程模型)。 另外,我有一个 openacademy.xml,我在其中定义了表单视图以打开会话表单视图。
<record model="ir.ui.view" id="session_form_view">
<field name="name">session.form</field>
<field name="model">openacademy.session</field>
<field name="arch" type="xml">
<form>
<header>
<button name="draft" type="workflow"
string="Reset to draft"
states="confirmed,done"/>
<button name="confirm" type="workflow"
string="Confirm" states="draft"
class="oe_highlight"/>
<button name="done" type="workflow"
string="Mark as done" states="confirmed"
class="oe_highlight"/>
<button type="object"
name="my_method"
string="New course"/>
<field name="state" widget="statusbar"/>
</header>
<sheet>
<group string="General">
<field name="name" string="Session name"/>
<field name="course_id" string="Course"/>
<field name="instructor_id" string="Instructor"/>
</group>
<group string="Management">
<field name="start_date" string="Start date"/>
<field name="active" string="Active"/>
<field name="duration" string="Duration (in days)"/>
<field name="seats"/>
<field name="percent_taken_seats" widget="progressbar"/>
</group>
<label for="attendees"/>
<field name="attendees"/>
</sheet>
</form>
</field>
</record>
上述代码的相关部分如下:
<button type="object" name="my_method" string="New course"/>
当我单击此按钮时,将调用会话模型(class 会话)中的方法 'my_method'。
class Session(models.Model):
...
@api.one
def my_method(self):
return {
'type': 'ir.actions.act_window',
'res_model': 'openacademy.course',
'view_type': 'form',
'view_mode': 'form',
'target': 'new',
}
此方法 return 包含 window 操作的不同键和值的字典,但它在 Odoo 8 中不起作用。 当我点击按钮 "New course" 时,my_method 被执行但课程表单视图没有打开以创建新的课程记录。
我不知道是否可以在 Odoo 版本 8 中执行此操作,或者 my_method 是否必须 return 更多内容。
尝试使用@api.multi
我编写了 return 一个 window 动作的函数。 与您的代码的唯一区别是我的装饰器。 否则,在你的函数中使用打印作为调试 确保它被调用的工具
装饰器有问题@api.one
。一个装饰器将方法的结果包装成一个像这样的字典:
{res_id: result}
这意味着在你的情况下,你实际上 returning
{res_id: act_window}
或者在数组中直接调用: [act_window]
不幸的是,odoo 期望自己得到结果(在某个时候会得到 returned 的实际结果)。
在你的情况下,你应该改用这个:
@api.multi
def my_method(self):
self.ensure_one()
return {
'type': 'ir.actions.act_window',
'res_model': 'openacademy.course',
'view_type': 'form',
'view_mode': 'form',
'target': 'new',
}
self.ensure_one
在这种情况下并不是特别必要,但真正重要的是使用 @api.multi
。它不会将结果包装在任何东西中,并且 return 与您 return 完全不同 api.one
。
就我个人而言,我更喜欢使用 api.multi
,因为 api.multi
在任何情况下都能保持整洁。当我开始使用 @api.one
时,我在很多地方都遇到了这样的事情:
val = self._compute_something()[0]
你必须在其中获取第一个元素,因为 odoo 将它包装到一个列表中......而 @api.multi
更灵活,如果你真的想强制使用一个元素调用它,你可以随时使用ensure_one
。