Help

ようこそ!

このフォーラムはOdooに興味がある方はどなたでも参加いただけます。Odooに関する質問を投稿したり、質問に回答したりすることができます。

1

ツリービューでフォーム表示したい

Avatar
江口和志

ツリービューでフォーム表示したく、以下のURLを参考にしています。
https://www.odoo.com/forum/help-1/question/how-to-add-edit-button-in-tree-view-to-get-form-view-90708

ボタンの表示まではできるのですが、実際にボタンをクリックすると
AttributeError: type object 'project.project' has no attribute 'open_record'

となります

状況として、カスタムモジュールの定義ファイル「__init__.py」で、新たに「project_open_form.py」を作成、
作成した、ファンクションをツリービューで読み込んでいるつもりです。
定義する箇所が誤っていると思うのですが、どなたかアドバイス頂けますでしょうか?

Avatar
Discard
6 Answers
0
Avatar
Yoshi Tashiro (QRTL)
Best Answer

Timの回答からもう少し踏み込んで、実装例です。V10でそのまま使えるはずです。

Python:

# -*- coding: utf-8 -*-

from odoo import models, api


class ProjectProject(models.Model):
_inherit = 'project.project'

@api.multi
def open_form_view(self):
self.ensure_one()
view_id = self.env['ir.model.data'].get_object_reference(
'project', 'edit_project')[1] or False
return {
'name': 'action_open_form_view',
'view_type': 'form',
'view_mode': 'form',
'view_id': view_id,
'res_model': 'project.project',
'type': 'ir.actions.act_window',
'nodestroy': True,
'target': 'current',
'res_id': self.id,
}


XML:

                <button name="open_form_view" type='object' icon="fa-file-o"/>


Avatar
Discard
0
Avatar
Tim Siu Lai
Best Answer

 >>ボタンの表示まではできるのですが、実際にボタンをクリックすると

>>AttributeError: type object 'project.project' has no attribute 'open_record'

エラーメッセージの解析ですが、モデル project.project で open_record と言うの関数が定義されません。

https://www.odoo.com/forum/help-1/question/how-to-add-edit-button-in-tree-view-to-get-form-view-90708 に従う、project_open_form.py で継承モデル project.project を追加する必要があります。

例として、project_open_form.py の中身は

from odoo import models, fields, api

class Projectproject(models.Model):

_inherit = 'project.project'

def open_record(self):

res_model = 'project.project'

view_name = '<view_name>'

document_id = self.browse().id

view = self.env['ir.model.date'].get_object_reference(res_model, view_name)

view_id = view and view[1] or False

return {

'name': '<action_name>',

'view_type': 'form',

'view_mode': 'form',

'view_id': view_id,

'res_model': res_model,

'type': 'ir.actions.act_window',

'nodestroy': True,

'target': 'current',

'res_id': document_id,

}

この情報があなたのお役に立てば幸いです。

4 Comments
Avatar
Discard
Avatar
江口和志
-

頂いた内容で試したのですがだめでした。

現在の構成として

モジュールフォルダ
└__init__.py
中身は from . import models のみ
└models
└__init__.py ※ここで from . import project_open_form としています。
└project_open_form.py

以下が中身です
   

from odoo import models, fields, api

class Projectproject(models.Model):
    _inherit = 'project.project'

    def open_record(self):
        name = 'project open'
        res_model = 'project.project'
        view_name = 'view.project.project'

        document_id = self.browse(cr, uid, ids[0]).id
        view = models.get_object_reference(cr, uid, name, view)
        view_id = view and view[1] or False

        return {

            'name': (name),

            'view_type': 'form',

            'view_mode': 'form',

            'view_id': [view_id],

            'res_model': res_model,

            'type': 'ir.actions.act_window',

            'nodestroy': True,

            'target': 'current',

            'res_id': document_id,

        }


また、Treeビューのボタンとして

と、設定しております
Avatar
江口和志
-

button name="open_record" type="object" string="編集" がボタンです

Avatar
江口和志
-

その後、エラーをもとに、修正をしたのですが。 以下のエラーより、先に進みません。

TypeError: open_record() takes at least 4 arguments (2 given)
現在のモデルは以下です
from odoo import models, fields, api

class Projectproject(models.Model):
    _inherit = 'project.project'

    @api.multi
    def open_record(self, cr, uid, ids, context=None):

        if not context:
            context = {}

        name = 'project'
        res_model = 'project.project'
        view_name = 'project.edit_project'

        document_id = self.browse(cr, uid, ids[0]).id
        view = models.get_object_reference(cr, uid, name, view_name)
        view_id = view and view[1] or False

        return {

            'name': (name),
            'view_type': 'form',
            'view_mode': 'form',
            'view_id': [view_id],
            'res_model': res_model,
            'type': 'ir.actions.act_window',
            'nodestroy': True,
            'target': 'current',
            'res_id': document_id,

        }
[get_object_reference]に引き稿す要素が足しないのか、[open_record]に渡す要素が多いのかで困っています。 [open_record]をselfだけ渡した場合、g[et_object_reference]でcrがないため、エラーになり追加しています。
Avatar
Tim Siu Lai
-

Odoo 10 以降、パラメータにcr, uid, ids, context を指定する必要はありません。 [get_object_reference]、[open_record]と[browse]からcr, uid, ids, contextを削除すれば、記載したエラーを解決することができます。 Odoo 10 に対して、最初の回答を編集しました、編集した部分をご覧ください。