Odoo - 阻止按钮关闭向导

时间:2015-08-12 10:56:35

标签: python xml python-2.7 odoo-8 odoo

我有一个用作对话框的瞬态模型。在我的表单视图中,我有一个这样的按钮:

<footer states="partnerId">
   <button name="check_tax_id" string="Tovább" type="object"/>
</footer>

按钮调用此函数(我可以确认它实际调用):

@api.one
    def check_tax_id(self, context=None):
        self.state = "partnerDetails"

        return None;

我的问题是,单击此按钮后,对话框窗口立即关闭! 我做错了什么?

6 个答案:

答案 0 :(得分:21)

解决方案0

@api.multi
def check_tax_id(self):
    self.ensure_one()
    self.name = "New name"
    return {
        "type": "ir.actions.do_nothing",
    }

此解决方案由Tadeusz Karpinski提供here

解决方案1 ​​

您可以返回具有相同记录ID的新表单。

@api.multi
def check_tax_id(self):
    self.ensure_one()
    self.name = "New name"
    return {
        'context': self.env.context,
        'view_type': 'form',
        'view_mode': 'form',
        'res_model': 'model_name',
        'res_id': self.id,
        'view_id': False,
        'type': 'ir.actions.act_window',
        'target': 'new',
    }

解决方案2

您可以在jQuery中创建一个小部件。这将打开向导,您可以手动将所需的行为分配给按钮。您也可以使用call函数来调用python函数:

[...]

new instance.web.Dialog(this, { 
    title: _t("Title"), 
    width: '95%', 
    buttons: [
          { text: _t("First button"), click: function() { self.first_button(); }}, 
          { text: _t("Second button"), click: function() { self.second_button(); }},
          { text: _t("Close"), click: function() {  dialog.close(); }},                       
      ],
});

[...]

解决方案3

当然,您也可以覆盖create方法,以避免在某些情况下创建记录

解决方案4

最后一个选择。使用州字段创建工作流程。创建工作流按钮以发送信号以更改状态。您可以使用attrs属性和state字段显示或隐藏其余字段。但我不知道这是否能适应您的需求。

答案 1 :(得分:7)

在我的情况下,此代码有效。

@api.multi
def test(self):
    l = logging.getLogger()
    l.warn("xD")
    return {
        "type": "ir.actions.do_nothing",
    }

答案 2 :(得分:3)

最简单的方法是:

@api.multi
def null_action(self):
    return {
        "type": "set_scrollTop",
    }

由于该类型用于调用类ActionManager(javascript)

上的任何方法

它比“type”更好:“ir.actions.do_nothing”会产生异常(此属性不存在)

答案 3 :(得分:2)

昨天我碰到了同样的问题。我需要显示一个按钮来做某事而不提交整个wizaard。我根本不使用按钮来解决这个问题。它非常简单有效。你需要什么:

  1. 向导模型中的布尔标志
  2. 附加到标志的onchange(替换你的sumbmit函数)
  3. 将视图中的按钮替换为带有invisible="1"标志的标记,并将标签设置为按钮
  4. 以下是代码:

    source_it = fields.Boolean(string='Source')
    [...]
    def action_source(self):
        # do stuff
    
    @api.onchange('source_it')
    def onchange_source_it(self):
        if self.env.context.get('sourcing_now') or not self.source_it:
            return
        self.action_source()
    [...]
    <label for="source_it" class="pull-left btn btn-success" />
    <field name="source_it" invisible="1" />
    

    这个技巧有效,因为当标签具有for属性时,其行为类似于复选框本身,因此如果您点击标签,则实际上是在切换复选框。

答案 4 :(得分:0)

on odoo 7

def traszero(self ,cr ,uid ,ids ,context=None):
        data_obj = self.pool.get('stock.return.picking.line')
        ret_wizard = self.browse(cr, uid, ids, context=context)
        if ret_wizard.product_return_moves:
            line_ids = ret_wizard.product_return_moves.mapped('id')
            data_obj.write(cr, uid, line_ids, {'quantity': 0}, context=context)
        return {'name':"Return Shipment",
            'res_model':"stock.return.picking",
            'src_model':"stock.picking",
            'view_mode':"form",
            'target':"new",
            'key2':"client_action_multi",
            'multi':"True",
            'res_id':ids[0],
            'type': 'ir.actions.act_window',
            }

答案 5 :(得分:0)

你可以做的是让按钮打开另一个向导传递上下文,其中包含输入第一个向导的所有值。这允许你执行一些功能,即。你的按钮。并保持向导的状态。因此,向导中字段的默认值必须首先检查上下文并回退到其他内容。

以下是一个例子:

class MyWizard(models.TransientModel):
    _name = 'myaddon.mywizard'

    def _get_default_char(self):
        return self._context.get('mychar',"")

    mychar = fields.Char(string="My Char", default=_get_default_char)

    @api.multi
    def my_button(self):
        # Execute Function Here
        # reload wizard with context

        return {
            'view_type': 'form',
            'view_mode': 'form',
            'res_model': 'myaddon.mywizard',
            'type': 'ir.actions.act_window',
            'target': 'new',
            'context': '{"mychar":'HELLO WORLD'}',
        }