6

OpenERP 6.1では、このact_windowは次のとおりです。

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

スケジュールフォームに[学生]ボタンを作成し、適切な学生のみを表示する学生ツリービューを開きます。

私の目標は、適切にフィルタリングされた生徒のツリービューではなく、生徒の対応するフォームビューを直接開くことです。を追加しようとしましたview_mode="form,tree"が、必要なフォームではなく新しいフォームが開きます。contextこれは、act_window?に追加することでおそらく達成できると思います。たぶん、record_idですが、私はそれを試してみましたが、active_idうまくいきませんでした。

4

2 に答える 2

16

OpenERPアクションで特定のレコードのフォームビューを直接開く魔法の(そしておそらく文書化されていない)方法は、res_idアクションに追加の属性を設定することです。

残念ながら、OpenERP 6.1 [1]では、res_id属性はact_windowデータモデルの一部ではないため、XML宣言で直接設定することはできません。

ほとんどの公式アドオンは、返されたアクションの属性<button type="object" ... />を設定するPythonメソッドへのバインドを使用します。res_id公式モジュールのソースコードでこの例を見つけるのは非常に簡単であり、この関連する質問で1つ見ることができます。

クイック/未テストの例:

school.scheduleこれをフォームに追加します。

<button name="open_student_form" type="object" string="Student"/>

そして、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')],
    }

「サイドバーボタン」を使用して(つまり、を使用して)これを本当に実行したい場合は<act_window/>、サイドバーボタンをPythonメソッドに直接バインドできないため、少し注意が必要です。データベースに保存されているアクションにバインドする必要があります。ただし、たとえば、にバインドしてPythonメソッドを呼び出すか、同様のことを行うir.actions.serverアクションを介して、引き続き実行できます。<act_window/>の秘訣は、アクションディクショナリを変数ir.actions.serverに割り当てることで動的アクション定義を返すことができるPythonブロックとして定義できることです。actionそのパスをたどりたい場合は、OpenERPアドオンのソースコードを検索して、属性ir.actions.serverを持つアクションを返すメソッド(一部は同様のことを行う可能性があります)の宣言を探します。res_id

[1] OpenERP 7.0以降、res_id列はデータモデルで明示的に使用できるため、直接設定できます。

于 2012-11-05T18:38:28.377 に答える