Return onchange 函数的视图

Return a view from a onchange function

我想 return 来自 onchange 函数的视图,但无法重定向.. 这是我的代码

@api.multi
@api.onchange('product_id')
def product_id_change(self):
    model_obj = self.env['ir.model.data']
    if not self.product_id:
        return {'domain': {'product_uom': []}}

    vals = {}
    domain = {'product_uom': [('category_id', '=', self.product_id.uom_id.category_id.id)]}
    if not self.product_uom or (self.product_id.uom_id.category_id.id != self.product_uom.category_id.id):
    vals['product_uom'] = self.product_id.uom_id

    name = product.name_get()[0][1]
    if product.description_sale:
        name += '\n' + product.description_sale
    vals['name'] = name

    self._compute_tax_id()

    if self.order_id.pricelist_id and self.order_id.partner_id:
        vals['price_unit'] = self.env['account.tax']._fix_tax_included_price(product.price, product.taxes_id, self.tax_id)
    self.update(vals)
    data_id = model_obj._get_id('hotelbeds', 'view_search_hotel')
    view_ids = model_obj.browse(data_id).res_id
    return {
            'type': 'ir.actions.act_window',
            'name': _('Hotel Search'),
            'domain': domain,
            'view_id' :view_ids,
            'view_type': 'form',
            'view_mode': 'form',
            'res_model': 'hotel.search',
            'target': 'new'
            }

请帮忙解决这个问题,我哪里错了或遗漏了什么?

@api.onchange 装饰方法不应该 return 任何东西。他们只是编辑您正在创建或编辑的对象的 "in memory" 版本。 Odoo 不期望该方法 return 任何东西,也不会根据方法的结果采取行动。

实现您正在做的事情的最佳方法是在产品的 select 字段旁边放置一个按钮。该按钮将调用一个方法,该方法将 return 相应的操作。

<record id="your_view" model="ir.ui.view">
    <field name="name">your_view_name</field>
    <field name="model">your.model</field>
    <field name="arch" type="xml">
        <field name="product_id"/>
        <button name="redirect" string="Find hotel" type="object" class="oe_highlight"/>
    </field>
</record>

并在您的模型文件中

@api.multi
def redirect(self):
    model_obj = self.env['ir.model.data']
    if not self.product_id:
        return {'domain': {'product_uom': []}}
    vals = {}
    domain = {'product_uom': [('category_id', '=', self.product_id.uom_id.category_id.id)]}
    if not self.product_uom or (self.product_id.uom_id.category_id.id != self.product_uom.category_id.id):
    vals['product_uom'] = self.product_id.uom_id
    name = product.name_get()[0][1]
    if product.description_sale:
        name += '\n' + product.description_sale
    vals['name'] = name
    self._compute_tax_id()
    if self.order_id.pricelist_id and self.order_id.partner_id:
        vals['price_unit'] = self.env['account.tax']._fix_tax_included_price(product.price, product.taxes_id, self.tax_id)
    self.update(vals)
    data_id = model_obj._get_id('hotelbeds', 'view_search_hotel')
    view_ids = model_obj.browse(data_id).res_id
    return {
            'type': 'ir.actions.act_window',
            'name': _('Hotel Search'),
            'domain': domain,
            'view_id' :view_ids,
            'view_type': 'form',
            'view_mode': 'form',
            'res_model': 'hotel.search',
            'target': 'new'
            }