求助通过按钮弹出窗口问题
-
目前想实现一个功能,点击按钮弹出一个新窗口,教程上的例子,在xml文件的button name那里指定action,不太符合我的要求,我希望做到的是如下:
py文件:<br />def button_event()<br /> status=XX <br /> if status=true<br /> XXX<br /> else<br /> pop_window() <br />
XML文件<br /><record model="ir.actions.act_window" id="action_my_action"><br /> <field name="name">My Action</field><br /> <field name="res_model">my.class</field><br /> <field name="view_type">form</field><br /> <field name="view_mode">form</field><br /> <field name="view_id" ref="view_my_action"/><br /></record><br /><br /><button name="button_event" string="Event"<br /> states="draft,open" type="object"<br /> icon="gtk-media-pause" /><br />
如上述代码,点击button的时候,触发的是button_event函数,这个函数中有一个判断,满足条件才会弹出一个窗口,否则做其他的事情,而弹出窗口的函数pop_window(),现在遇到了问题,我要弹出的是view_my_action这个view,所用的代码如下:<br />data_obj = self.pool.get('ir.model.data')<br />data_id = data_obj._get_id(cr, uid, 'my.class', 'action_my_action')<br />
则系统提示:No references to my.class.action_my_action
请问在pop_window函数中,如何才能与action_my_action或者view_my_action关联使之能够弹出呢?
非常感谢! -
data_id = data_obj._get_id(cr, uid, 'my.class', 'action_my_action')
上面的代码中‘my.class'的位置应该是你的模块的名字,而不是model name
另外,你本意可能是使用 [tt]get_object_reference[/tt]函数,该函数返回的是指定xml_id所对应的资源对象的model(即数据库表)和res_id(表中的记录号) -
非常感谢digitalsatori,那行代码改成模块名字后,没有提示错误了,但是那个该死的窗口死活也不出来,请再帮忙看看是什么问题。非常感谢。
<br />def pop_window(self, cr, uid, ids, context=None):<br /> mod_obj = self.pool.get('ir.model.data') <br /> form_res = mod_obj.get_object_reference(cr, uid, 'my_module_name', 'action_my_action') <br /> form_id = form_res and form_res[1] or False<br /> value = {<br /> 'name': _('Name'),<br /> 'view_type': 'form',<br /> 'view_mode': 'form',<br /> 'res_model': 'my.class',<br /> 'views': [(form_id, 'form')],<br /> 'type': 'ir.actions.act_window',<br /> }<br /> return value<br /><br />def button_event(self, cr, uid, ids, *args):<br /> self.pop_window(cr, uid, ids, None)<br />
-
你的form_res取到的是一个action id, 事实上你希望得到的是一个view id, 改成如下:
form_res = mod_obj.get_object_reference(cr, uid, 'my_module_name', 'view_my_action')
并且在返回字典中添加:'target': 'new'
-
非常感谢,但是这样做也还是弹不出来窗口,我把我的思路再梳理一下,麻烦请帮忙看看是否还有其他地方出错了,非常感谢。
新建一个模块,文件夹名称:my_module_name,其中有my_module_name.py 和 my_module_name_view.xml
py文件:my_class类中有button_event和pop_window两个函数,其中button_event函数需要调用pop_window。在pop_window函数中,关联了xml定义的view_my_action这个form,希望能弹出这个form的窗口。<br />class my_class(osv.osv):<br /> _name="my.class"<br /> _columns={<br /> 'name': fields.char('名称', size=128, required=True), <br /> }<br /><br /> def pop_window(self, cr, uid, ids, context=None):<br /> mod_obj = self.pool.get('ir.model.data') <br /> form_res = mod_obj.get_object_reference(cr, uid, 'my_module_name', 'view_my_action') <br /> form_id = form_res and form_res[1] or False<br /> value = {<br /> 'name': _('Name'),<br /> 'view_type': 'form',<br /> 'view_mode': 'form',<br /> 'res_model': 'my.class',<br /> 'views': [(form_id, 'form')],<br /> 'type': 'ir.actions.act_window',<br /> 'target': 'new',<br /> }<br /> return value<br /> <br /> def button_event(self, cr, uid, ids, *args):<br /> self.pop_window(cr, uid, ids, None)<br />my_class()<br />
XML文件:有my_class_form_view和view_my_action这两个form,其中my_class_form_view是主form,上面有一个button,关联函数button_event,希望通过这个按钮,能弹出view_my_action这个form。<br /><record id="view_my_action" model="ir.ui.view"><br /> <field name="name">my.class.form1</field><br /> <field name="model">my.class</field><br /> <field name="type">form</field><br /> <field name="arch" type="xml"><br /> <form string="Button Action"><br /> <field name="name"/><br /> </form><br /> </field><br /></record><br /><br /><record id="my_class_form_view" model="ir.ui.view"><br /> <field name="name">my.class.form</field><br /> <field name="model">my.class</field><br /> <field name="type">form</field><br /> <field name="arch" type="xml"><br /> <form string="弹窗"><br /> <button name="button_event" string="pop"<br /> states="open,draft,pending" type="object"<br /> icon="gtk-go-up" /><br /> </form><br /> </field><br /></record><br />
-
定义了my.class Model定义_columns了吗, 另外 'target': 'new' 加 了吗?
有什么错误信息? -
这样交流有点累,每次只挤一点信息给我。不知道你在上面贴的那个
'target': new
, 和你实际的代码是否一致,应该是[quote]'target':'new'[/quote]
-
试试这样:
def button_event(self, cr, uid, ids, *args):<br /> return self.pop_window(cr, uid, ids, None)<br />