act_window中的openerp上下文

3a2*_*oub 6 python openerp

在OpenERP 6.1中,这个act_window:

<act_window
     domain="[('id', '=', student)]"
     id="act_schedule_student"
     name="Student"
     res_model="school.student"
     src_model="school.schedule"/>
Run Code Online (Sandbox Code Playgroud)

Schedule表单中创建一个Student按钮,打开学生树视图,仅显示相应的学生.

我的目标是直接打开学生的相应表单视图,而不是使用正确的筛选学生打开树视图.我尝试添加一个,view_mode="form,tree"但它打开一个新的表单,而不是我想要的.我猜这可以通过添加contextact_window?也许是一个record_id,但我尝试过,active_id它没有用.

odo*_*ony 16

让OpenERP操作直接打开给定记录的表单视图的神奇(可能是未记录的)方法是res_id在操作上设置一个额外的属性.

不幸的是,在OpenERP 6.1 [1]中,res_id属性不是act_window数据模型的一部分,因此不可能直接在XML声明中设置它.

大多数官方插件使用<button type="object" ... />绑定到Python方法,该方法res_id在返回的操作中设置属性.在官方模块的源代码中很容易找到这个例子,你可以在这个相关的问题中看到一个.

快速/未经测试的示例:

您可以在school.schedule表单中添加:

<button name="open_student_form" type="object" string="Student"/>
Run Code Online (Sandbox Code Playgroud)

以及school.schedule模型中的以下方法:

def open_student_form(self, cr, uid, ids, context=None):
    this = self.browse(cr, uid, ids, context=context)[0]
    return {
        'type': 'ir.actions.act_window',
        'name': 'Student',
        'view_mode': 'form',
        'view_type': 'form',
        'res_model': 'school.student',
        'nodestroy': 'true',
        'res_id': this.student.id, # assuming the many2one is (mis)named 'student'
        'views': [(False, 'form')],
    }
Run Code Online (Sandbox Code Playgroud)

现在,如果你真的想用"侧边栏按钮"(即带有<act_window/>)来做这件事,它会变得有点棘手,因为你不能直接将侧边栏按钮绑定到Python方法; 它必须绑定到存储在数据库中的操作.但它仍然可行,例如通过一个ir.actions.server可以绑定到你的动作<act_window/>并调用你的Python方法或做类似的事情.诀窍ir.actions.server在于它可以定义为一个Python块,它可以通过为action变量分配一个动作字典来返回动态动作定义.如果您想要遵循该路径,请搜索OpenERP插件源代码以获取ir.actions.server(其中一些可能执行类似操作)的声明和返回具有res_id属性的操作的方法.

[1]从OpenERP 7.0开始,该res_id列在数据模型中明确可用,因此您可以直接设置它.