Odoo中文社区可以通过以下三个域名访问:shine-it.net , odoocn.org,odoo.net.cn

原论坛用户的基本信息和发帖这里都予以保留,请注意:原论坛用户无需重新注册新用户,但是您的密码需要重置

开发人员可以登录gitter讨论组: http://gitter.im/odoo-china/Talk, 需要github账号

如果您登录系统碰到问题,请在微信公众号留言:

求助通过按钮弹出窗口问题



  • 目前想实现一个功能,点击按钮弹出一个新窗口,教程上的例子,在xml文件的button name那里指定action,不太符合我的要求,我希望做到的是如下:
    py文件:
    [code]
    def button_event()
        status=XX 
        if status=true
          XXX
        else
          pop_window()     
    [/code]

    XML文件
    [code]
    <record model="ir.actions.act_window" id="action_my_action">
                <field name="name">My Action</field>
                <field name="res_model">my.class</field>
                <field name="view_type">form</field>
                <field name="view_mode">form</field>
                <field name="view_id" ref="view_my_action"/>
    </record>

    <button name="button_event" string="Event"
                            states="draft,open" type="object"
                            icon="gtk-media-pause" />
    [/code]

    如上述代码,点击button的时候,触发的是button_event函数,这个函数中有一个判断,满足条件才会弹出一个窗口,否则做其他的事情,而弹出窗口的函数pop_window(),现在遇到了问题,我要弹出的是view_my_action这个view,所用的代码如下:
    [code]
    data_obj = self.pool.get('ir.model.data')
    data_id = data_obj._get_id(cr, uid, 'my.class', 'action_my_action')
    [/code]
    则系统提示:No references to my.class.action_my_action
    请问在pop_window函数中,如何才能与action_my_action或者view_my_action关联使之能够弹出呢?
    非常感谢!



  • 目前想实现一个功能,点击按钮弹出一个新窗口,教程上的例子,在xml文件的button name那里指定action,不太符合我的要求,我希望做到的是如下:
    py文件:
    [code]
    def button_event()
        status=XX 
        if status=true
          XXX
        else
          pop_window()     
    [/code]

    XML文件
    [code]
    <record model="ir.actions.act_window" id="action_my_action">
                <field name="name">My Action</field>
                <field name="res_model">my.class</field>
                <field name="view_type">form</field>
                <field name="view_mode">form</field>
                <field name="view_id" ref="view_my_action"/>
    </record>

    <button name="button_event" string="Event"
                            states="draft,open" type="object"
                            icon="gtk-media-pause" />
    [/code]

    如上述代码,点击button的时候,触发的是button_event函数,这个函数中有一个判断,满足条件才会弹出一个窗口,否则做其他的事情,而弹出窗口的函数pop_window(),现在遇到了问题,我要弹出的是view_my_action这个view,所用的代码如下:
    [code]
    data_obj = self.pool.get('ir.model.data')
    data_id = data_obj._get_id(cr, uid, 'my.class', 'action_my_action')
    [/code]
    则系统提示:No references to my.class.action_my_action
    请问在pop_window函数中,如何才能与action_my_action或者view_my_action关联使之能够弹出呢?
    非常感谢!


  • 管理员

    [code]data_id = data_obj._get_id(cr, uid, 'my.class', 'action_my_action')[/code]
    上面的代码中‘my.class'的位置应该是你的模块的名字,而不是model name

    另外,你本意可能是使用 [tt]get_object_reference[/tt]函数,该函数返回的是指定xml_id所对应的资源对象的model(即数据库表)和res_id(表中的记录号)



  • 非常感谢digitalsatori,那行代码改成模块名字后,没有提示错误了,但是那个该死的窗口死活也不出来,请再帮忙看看是什么问题。非常感谢。
    [code]
    def pop_window(self, cr, uid, ids, context=None):
      mod_obj = self.pool.get('ir.model.data')
      form_res = mod_obj.get_object_reference(cr, uid, 'my_module_name', 'action_my_action')
      form_id = form_res and form_res[1] or False
      value = {
                            'name': _('Name'),
                            'view_type': 'form',
                            'view_mode': 'form',
                            'res_model': 'my.class',
                            'views': [(form_id, 'form')],
                            'type': 'ir.actions.act_window',
                          }
      return value

    def button_event(self, cr, uid, ids, *args):
      self.pop_window(cr, uid, ids, None)
    [/code]


  • 管理员

    你的form_res取到的是一个action id, 事实上你希望得到的是一个view id, 改成如下:
    [code]form_res = mod_obj.get_object_reference(cr, uid, 'my_module_name', 'view_my_action')[/code]

    并且在返回字典中添加:
    [code]'target': 'new'[/code]



  • 非常感谢,但是这样做也还是弹不出来窗口,我把我的思路再梳理一下,麻烦请帮忙看看是否还有其他地方出错了,非常感谢。
    新建一个模块,文件夹名称: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的窗口。

    [code]
    class my_class(osv.osv):
        _name="my.class"
        _columns={
                'name': fields.char('名称', size=128, required=True),
        }

      def pop_window(self, cr, uid, ids, context=None):
          mod_obj = self.pool.get('ir.model.data')
          form_res = mod_obj.get_object_reference(cr, uid, 'my_module_name', 'view_my_action')
          form_id = form_res and form_res[1] or False
          value = {
                            'name': _('Name'),
                            'view_type': 'form',
                            'view_mode': 'form',
                            'res_model': 'my.class',
                            'views': [(form_id, 'form')],
                            'type': 'ir.actions.act_window',
                            'target': 'new',
                          }
          return value
       
        def button_event(self, cr, uid, ids, *args):
            self.pop_window(cr, uid, ids, None)
    my_class()
    [/code]

    XML文件:有my_class_form_view和view_my_action这两个form,其中my_class_form_view是主form,上面有一个button,关联函数button_event,希望通过这个按钮,能弹出view_my_action这个form。

    [code]
    <record id="view_my_action" model="ir.ui.view">
        <field name="name">my.class.form1</field>
        <field name="model">my.class</field>
        <field name="type">form</field>
        <field name="arch" type="xml">
                <form string="Button Action">
                    <field name="name"/>
                </form>
        </field>
    </record>

    <record id="my_class_form_view" model="ir.ui.view">
        <field name="name">my.class.form</field>
        <field name="model">my.class</field>
        <field name="type">form</field>
        <field name="arch" type="xml">
                <form string="弹窗">
                      <button name="button_event" string="pop"
                              states="open,draft,pending" type="object"
                              icon="gtk-go-up" />
                </form>
      </field>
    </record>
    [/code]


  • 管理员

    定义了my.class Model定义_columns了吗, 另外 'target': 'new' 加 了吗?
    有什么错误信息?



  • 定义了columens了,target:new也增加了,没有错误信息。程序里面设置的是点了这个按钮,弹出窗口,然后state,也就是阶段变成变成下一阶段。现在阶段变了,但是窗口没有弹出来。


  • 管理员

    这样交流有点累,每次只挤一点信息给我。不知道你在上面贴的那个[code] 'target': new[/code], 和你实际的代码是否一致,应该是[quote]'target':'new'[/quote]



  • 非常抱歉,我已经把4楼的代码重新核对过了,现在应该没有问题了。
    另外,我又做了测试,发现如果在xml的button那里直接调用pop_window是可以弹出窗口的,调用button_event却不行,那么应该说明是button_event里面的调用代码:self.pop_window(cr, uid, ids, None) 这句出了问题。
    请问是否这样的调用是不允许的,或者语法上有其他错误吗?
    非常感谢!


  • 管理员

    试试这样:
    [code]def button_event(self, cr, uid, ids, *args):
        return self.pop_window(cr, uid, ids, None)
    [/code]



  • 非常感谢,这样做可以了。


登录后回复
 

与 Odoo 中文社区 的连接断开,我们正在尝试重连,请耐心等待