加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Odoo 8 – 从python方法启动ir.actions.act_window?

发布时间:2020-12-20 11:42:56 所属栏目:Python 来源:网络整理
导读:是否可以从模型的 Python方法启动ir.actions.act_window? 例如,我已经实现了一个表示课程会话的会话模型(我也有一个课程模型). 另外,我有一个openacademy.xml,我已经定义了表单视图来打开会话表单视图. record model="ir.ui.view" id="session_form_view" f
是否可以从模型的 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”/>

当我单击此按钮时,将调用Session模型(类Session)中的方法“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',}

此方法返回包含不同键和窗口操作值的字典,但它在Odoo 8中不起作用.
当我单击“新课程”按钮时,会执行my_method,但不会打开课程表单视图来创建新的课程记录.

我不知道是否可以在Odoo版本8中执行此操作,或者如果my_method必须返回更多内容.

解决方法

问题出在装饰者@ api.one上.一个装饰器将方法的结果包装成这样的dict:

{res_id: result}

这意味着在您的情况下,您实际上正在返回

{res_id: act_window}

如果你直接调用它,或者在数组中:
????[act_window]

不幸的是,odoo希望得到结果本身(实际上会在某些时候返回).

在您的情况下,您应该使用此:

@api.multi
def my_method(self):
    self.ensure_one()
    return {
        'type': 'ir.actions.act_window',}

self.ensure_one在这种情况下并不是特别必要,但真正重要的是使用@ api.multi.它不会将结果包装在任何内容中,并且与api.one不同,它会返回您返回的内容.

就个人而言,我更喜欢使用api.multi,因为api.multi在所有情况下都保持干净.当我开始使用@ api.one时,我在许多地方遇到了类似的事情:

val = self._compute_something()[0]

你必须获得第一个元素,因为odoo将它包装到一个列表中…而@ api.multi更灵活,如果你真的想用一个元素强制它被调用,你总是可以使用ensure_one.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读