ツリービューでフォーム表示したく、以下の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」を作成、
作成した、ファンクションをツリービューで読み込んでいるつもりです。
定義する箇所が誤っていると思うのですが、どなたかアドバイス頂けますでしょうか?
6 回答
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"/>
>>ボタンの表示まではできるのですが、実際にボタンをクリックすると
>>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,
}
この情報があなたのお役に立てば幸いです。
頂いた内容で試したのですがだめでした。
現在の構成として
モジュールフォルダ
└__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ビューのボタンとして
と、設定しております
その後、エラーをもとに、修正をしたのですが。 以下のエラーより、先に進みません。
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がないため、エラーになり追加しています。