2017-01-18 2 views
0

Я хочу вернуть вид из OnChange функции, но не в состоянии перенаправлять .. Вот мой кодВозвращает вид из 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' 
      } 

Пожалуйста, помогите с этим вопросом, куда я иду неправильно или что-то не хватает?

+0

Что именно вы имеете в виду под «не в состоянии перенаправлять» (Пожалуйста, добавьте больше контекста на свой вопрос). Также я не думаю, что вы должны использовать 'onchange', чтобы вернуть представление. Какая большая проблема вы пытаетесь решить, может быть лучшее решение – danidee

+0

Привет, Danidee, Actualy Я хочу вернуть представление, когда мы выбираем product_id в order_line в цитате. Так что я унаследовал функцию onchange и попытался вернуть представление из этого onchange, но не смог вернуть представление. –

ответ

1

@api.onchange оформленные методы не должны ничего возвращать. Они просто редактируют версию «в памяти» объекта, который вы создаете или редактируете. Odoo не ожидает, что этот метод вернет что-либо и не будет принимать действия в зависимости от результата метода.

Лучший способ добиться того, что вы делаете, - это поставить кнопку рядом с полем выбора продукта. Эта кнопка вызовет метод, который вернет соответствующее действие.

<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' 
      } 
+0

Здравствуйте @Majikat, ваше решение очень хорошее. Это именно то, что я сделал. Но клиенту нужно, чтобы представление было открыто без сохранения записи (он считает, что эта экономичная запись занимает много времени), и решение кнопки работает, когда запись сохранена. Но он хочет, чтобы было сохранено 40 строк заказов, и когда он добавляет 41-ю строку заказа без сохранения цитаты, когда он нажимает на кнопку, действие должно быть возвращено. Но этого не происходит. Так что я пошел на функцию обмена ... но это решение также кажется неработоспособным ... можете ли вы дать некоторые предложения !! –

+1

Для этого вы должны использовать промежуточную модель. Модель, которую вы используете для выбора, не использует пользовательские модели. Моделями, наследующими класс, используйте 'models.TransientModel'. Эта модель используется для мастеров и сохраняется только в памяти (а не в базе данных). Но вы можете использовать его запись, как и любую другую запись. – Majikat

+0

ok, так что я делаю цитату enirly в wizard, так как кнопка, которую я добавил, только в xml, и я возвращаю xml-действие для этого и не написал никакого метода. Вот мой xml-код для кнопки

Смежные вопросы